【PHP】foreachで配列の最初と最後を判別する方法
配列の要素をすべて取り出す際foreachをよく使いますが、foreachの最初と最後(配列の最初と最後の要素)を判別して処理を変えたいときがあります。
ここでは、foreachで配列の最初と最後を判別する方法を紹介します。
配列の最初と最後の値で判別
foreachで配列の最初と最後を判別する方法として、reset関数とend関数で配列の最初と最後の要素を取得してif構文で判別する方法があります。
reset(ここに配列)
このようにすることで、配列の最初の要素を返してくれます(ポインタが配列の最初にセットされる)。配列が空の場合falseを返します。詳しくはこちら。
end(ここに配列)
このようにすることで、配列の最後の要素を返してくれます(ポインタが配列の最後にセットされる)。配列が空の場合falseを返します。詳しくはこちら。
reset関数とend関数を使った場合次のようになります。
<?php //配列をセット $array = array(0,1,2,3,4,5); //配列の最初の値を出力 echo reset($array); //「0」が出力される //配列の最後の値を出力 echo end($array); //「5」が出力される ?>
サンプルプログラム
すなわち次のようにすればforeachで配列の最初と最後を判別して処理を分岐できます。
<?php //配列をセット $array = array(0,1,2,3,4,5); //ループで配列の要素を取り出す foreach($array as $value){ //最初の要素&最後の要素&それ以外を判別 if($value === reset($array)){ //最初の要素を出力 echo "最初の要素です。"; echo $value; } elseif($value === end($array)) { //最後の要素を出力 echo "最後の要素です。"; echo $value; } else { //最後と最後以外の要素を出力 echo "最初と最後以外の要素です。"; echo $value; } } ?>
配列の最初と最後のキーで判別
と、上記プログラムを実行したのですが、次のように配列に同じ要素(値)がある場合、当然ながら意図しない処理となってしまいました。
$array = array(0, 1, 2, 0, 3, 5, 4, 5);
そのため、最終的には(重複しない)配列のキーで判別することにしました。
each(ここに配列);
配列のキーを取得する場合、each関数を使います。この関数は、現在ポインタされている配列のキー(正確にはキーと要素)を返してくれます。詳細はこちら。
すなわち、
reset関数で配列の最初にポインタを合わせる → このときのキーを取得
end関数で配列の最後にポインタを合わせる → このときのキーを取得
という感じで、foreachの最初と最後を判別します。
サンプルプログラム
<?php //配列をセット $array = array(0, 1, 2, 0, 3, 5, 4, 5); //配列の最初にポインタを移動 reset($array); //このときのキーを取得 $array_first_info = each($array); $array_first_kye = $array_first_info["key"]; //配列の最後にポインタを移動 end($array); //このときのキーを取得 $array_last_info = each($array); $array_last_kye = $array_last_info["key"]; //ループで値を取り出す foreach($array as $key => $value){ //配列の最初と最後をキーで判別 if($key === $array_first_kye){ //最初の要素を出力 echo "最初の要素です。"; echo $value; } elseif($key === $array_last_kye) { //最後の要素を出力 echo "最後の要素です。"; echo $value; } else { //最後と最後以外の要素を出力 echo "最初と最後以外の要素です。"; echo $value; } } ?>
あわせて読んでほしい!
コメント
2:ペチパー:2015/07/17 16:37:30
ごっそりバリデーションされちゃいましたね。。。。
全角で再送信してみます。
<?php
$array_length = count($array) - 1;
$cnt = 0;
foreach($array as $key => $value){
switch(true){
case ($cnt == 0) :
echo "最初の要素です。";
break;
case ($array_length == $cnt) :
echo "最後の要素です。";
break;
default :
echo "最初と最後以外の要素です。";
break;
}
echo $value;
$cnt++;
}
1:ペチパー:2015/07/17 16:36:00
要素数を count() で取得した方が簡単ではないでしょうか。
$value){
switch(true){
case ($cnt == 0) :
echo "最初の要素です。";
break;
case ($array_length == $cnt) :
echo "最後の要素です。";
break;
default :
echo "最初と最後以外の要素です。";
break;
}
echo $value;
$cnt++;
}