PHPで配列を作ったとき、先頭の値だけ取り出し削除したい場面があるかもしれません。
エスカレーターは乗った人から降りていきます。
降りた人はエスカレーターの上にはもういません。
ちょうどそんなイメージの配列操作の方法です。
この方法には array_shift() という関数が便利です。
配列の先頭の要素を取得し元の配列から削除するarray_shiftの使い方
array_shiftの使い方
[aside type=”normal”]array_shift(配列)[/aside]
引数には先頭の値を取り出したい配列をセットします。
戻り値は、配列の先頭の値になります。配列が空の場合にはnullが返ってきます。
そして、処理後には引数にセットした配列から先頭の値が削除され、インデックスが詰められます。
array_shiftのサンプルコード
array_shiftを使ったサンプルコードです。
$ary = array("東京", "大阪", "北海道", "沖縄");
$item = array_shift($ary);
echo "要素の値は、{$item}<br />";
print_r($ary);
これを実行すると以下のようになります。
要素の値は、東京
Array
(
[0] => 大阪
[1] => 北海道
[2] => 沖縄
)
配列の先頭の”東京”を取得し、元の配列からは削除されました。
インデックスも詰められていることが分かります。
ループで処理する場合は以下のようになります。
$ary = array("東京", "大阪", "北海道", "沖縄");
while($item = array_shift($ary)) {
echo "要素の値は、".$item."<br />";
print_r($ary);
echo "<br />";
}
結果は次の通りです。
要素の値は、東京
Array
(
[0] => 大阪
[1] => 北海道
[2] => 沖縄
)
要素の値は、大阪
Array
(
[0] => 北海道
[1] => 沖縄
)
要素の値は、北海道
Array
(
[0] => 沖縄
)
要素の値は、沖縄
Array
(
)
配列が空になったら自動的にループ処理も終わります。
でもぱっと使う場面が思い浮かばないです(笑)
なんか昔使ったことあるんですけどね。
なんの処理で使ったのかな?
ただ先頭の値を取得し削除したくない
ただ配列の先頭の要素を取得し、削除したくない場合はどうでしょう?
単純に0番目取得は?
$item = $ary[0];
上記のコードでいいんじゃないだろうか?と思った方は注意です。
配列の0番目が確実に存在する場合ならいいかもしれません。
しかし、次のような場合にはエラーになります。
- 配列に要素が存在しない場合
- 0番目が既に削除され、配列の先頭の要素のインデックスが1になっている場合
- 連想配列の場合
foreachを使ったら?
じゃあforeachを使ったら??
$ary = array("東京", "大阪", "北海道", "沖縄");
unset($ary[0]);
$item = null;
foreach($ary as $val) {
$item = $val;
break;
}
echo "要素の値は、".$item."<br />";
上のコードのように最初の値だけ取得してすぐにbreakしてしまえば先頭の要素が取得できます。
配列が既に空の場合は、foreach の前に $item をnullで初期化しているのでnullになります。
初期化しなくても、isset() などで値がセットされているか判定すれば大丈夫です。
だけど、foreach を使うと4行書かないといけないですよね。
先頭を取得したいだけなのにちょっと面倒な気がします。
配列の先頭の値を取得するのはreset()が便利
そんなとき便利なのがreset()です。
reset() は配列内部のポインタを先頭にセットする関数で、その点は今回はあまり関係ないです。
しかし、同時に先頭の要素を戻り値で返してくれます。
$ary = array("東京", "大阪", "北海道", "沖縄");
unset($ary[0]);
$item = reset($ary);
echo "要素の値は、{$item}<br />";
print_r($ary);
例えunset()で0番目の要素が削除されていても、残りの要素の先頭を返してくれます。
上のコードを実行すると以下のようになります。
要素の値は、大阪
Array
(
[1] => 大阪
[2] => 北海道
[3] => 沖縄
)
元の配列もそのままです。(unset()で削除したものは削除されます。)
まとめ
これで問題は解決したでしょうか?
便利な関数を知らなくてもゴリゴリ自前のロジックで作成することも可能ですし間違ってはいませんが、既にテストもされている関数がある場合はそれを利用したほうがコードも減るしバグも減りますね!
配列から先頭を取得して、取得した要素を元の配列から削除する場合はarray_shiftを使います。
ただ配列から先頭を取得するだけで、取得した要素を削除しない場合はresetが使えます。










コメント