概要
配列の先頭・末尾要素をunshift()やpop()で取り出すと、元の配列が変更される。
これを変更せずに要素や部分配列を取り出したいときの方法。
配列
reset()/end()
配列の先頭・末尾を取り出すことに特化した関数はないが、ポインターを先頭に巻き戻すrest()関数、最後に移動させるend()の戻り値が移動後の要素を指していることを利用する。
ただし、これらの関数がポインターを移動させるため、独自にポインターを使っている中で使うと副作用が生じ得る。
| 1 2 3 4 5 6 7 8 | $a = [10, 11, 12, 13, 14]; $head = reset($a); $tail = end($a); echo $head, '<br>'; echo $tail, '<br>'; // 10 // 14 | 
array_slice()
array_slice()関数は、0から始まるオフセットと長さを指定して配列の任意の部分配列を取り出す。
array_list($array, $offset, $length)
| 1 2 3 4 5 6 7 8 9 10 11 12 | $a = [10, 11, 12, 13, 14]; $slice = array_slice($a, 1, 3); echo '<pre>'; print_r($slice); echo '</pre>'; // Array // ( //     [0] => 11 //     [1] => 12 //     [2] => 13 // ) | 
連想配列
連想配列の場合、array_slice()は想定通りに機能するが、先頭要素や末尾要素の場合は少し面倒。
部分列~array_slice()
部分列が連想配列として得られる。
| 1 2 3 4 5 6 7 8 9 10 11 12 | $a = ['zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; $slice = array_slice($a, 1, 3); echo '<pre>'; print_r($slice); echo '</pre>'; // Array // ( //     [one] => 1 //     [two] => 2 //     [three] => 3 // ¥) | 
先頭要素
reset()の引数に連想配列を指定した場合の戻り値は連想配列の「値」のみ。キーを取得するには、reset()で先頭に巻き戻された元の配列のキーを取得する。
ポインターを移動させるため副作用が生じ得る。
| 1 2 3 4 5 6 7 | $a = ['zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; $head_value = reset($a); echo key($a), '<br>'; echo $head_value, '<br>'; zero 0 | 
array_slice()を使ってもよく、この場合は副作用は生じない。
| 1 2 3 4 5 6 7 8 9 10 | $a = ['zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; $head = array_slice($a, 0, 1); echo '<pre>'; print_r($head); echo '</pre>'; Array (     [zero] => 0 ) | 
末尾要素
末尾要素は、reset()と同じようにend()関数を使ってポインターを移動させる。
ポインターを移動させるため副作用が生じ得る。
| 1 2 3 4 5 6 7 | $a = ['zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; $tail_value = end($a); echo key($a), '<br>'; echo $tail_value, '<br>'; four 4 | 
array_slice()を使っても末尾要素を取り出せるが、少しややこしくなる。
| 1 2 3 4 5 6 7 8 9 10 | $a = ['zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; $tail = array_slice($a, count($a) - 1, 1); echo '<pre>'; print_r($tail); echo '</pre>'; Array (     [four] => 4 ) |