【PHP】foreachで配列の最初と最後を判別する方法

公開日:
更新日:
カテゴリー: PHP

配列の要素をすべて取り出す際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;
	}

}
?>

 

頑張って書いたのでちょろっと読んでほしい!

 

コメント

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++;
}

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++;

コメントフォーム
お名前
コメント