PHP:配列をfor・while・foreachを使ってループさせて取り出す
PHPにはループにfor,while,foreach等がありますが、今回はこの3つを使用して配列を取り出す方法を書いていきます。
配列をループさせるのはforeachが一番使い勝手がいい(私はforeachばっかり使ってます…)と思うんですけど。。
連想配列はキーと値を別個に取り出すようにします。
配列の設定
今回は2つの配列を使用します。
通常の値のみの配列とキー・値の連想配列です。
//値のみの配列 $list1 = array( 'pc' , 'smartphone' , 'tablet'); //連想配列 $list2 = array( 'pc' => 'パソコン', 'smartphone' => 'スマホ', 'tablet' => 'タブ' );
for
値のみの配列
$count = count( $list1 ); for( $i = 0; $i < $count; ++$i ) { echo $list1[$i] . '<br>'; }
出力結果はこうなります。
pc smartphone tablet
まずcount()で配列の数を取得してそれ以下なら繰り返すってことです。
連想配列
$count = count( $list2 ); for( $i = 0; $i < $count; ++$i ) { list( $key , $val ) = each( $list2 ); echo $key . '-' . $val . '<br>'; }
出力結果はこうなります。
pc-パソコン smartphone-スマホ tablet-タブ
この場合$list2[$i]では値が取れません。$iの部分にはキーがこないといけないので。
そのためeach()を使って配列を順番に取り出していってます。
ただこのやり方はめんどくさいしforでやる意味もあまりないので連想配列を取り出すのにforは不向きということで。
while
値のみの配列
//方法1 $count = count( $list1 ); $i = 0; while( $i < $count ) { echo $list1[$i] . '<br>'; ++$i; } //方法2 while( $val = current( $list1 ) ) { echo $val . '<br>'; next( $list1 ); }
出力結果どちらもはこうなります。
pc smartphone tablet
方法1はやってることはforと一緒です。
方法2は配列を順番に取り出していくというものです。next()を書かないと無限ループになるのでご注意を!
方法2の注意
方法2でやる場合、配列の中の値に0,null,falseがあるとそこでループが終了してしまいます。
$list1 = array( 'pc' , 0 , 'tablet'); while( $val = current( $list1 ) ) { echo $val . '<br>'; next( $list1 ); } //結果 pc
ですので後述の↓each()を使った方法の方がいいです。
連想配列
while( list( $key , $val ) = each( $list2 ) ) { echo $key .'-'. $val . '<br>'; }
出力結果はこうなります。
pc-パソコン smartphone-スマホ tablet-タブ
forでやった取り方をもっと簡単にしたものですね。
whileは配列をループさせることができるのでforより使い勝手がいいです。
foreach
値のみの配列
foreach( $list1 as $val ) { echo $val . '<br>'; }
出力結果こうなります。
pc smartphone tablet
配列を順番に$valという変数に入れていくというものです。書き方的には一番簡素かと。
連想配列
foreach( $list2 as $key => $val ) { echo $key .'-'. $val . '<br>'; }
出力結果はこうなります。
pc-パソコン smartphone-スマホ tablet-タブ
foreachは通常の配列も連想配列もやりかたほとんど一緒なのでやっぱりforeach使いたくなりますねー。
注意事項
配列かどうか
配列を扱う場合、その変数が配列でないとエラーがでます。
ですのでis_array()で配列かどうかのチェックをしておくのがいいかと思います。
//配列じゃない変数をforeachでループさせる $list3 = 'not_array'; foreach( $list3 as $key => $val ) { echo $key .'-'. $val . '<br>'; } //こんなエラー Invalid argument supplied for foreach()
is_array()で分岐。
$list3 = 'not_array'; if( is_array( $list3 )) { foreach( $list3 as $key => $val ) { echo $key .'-'. $val . '<br>'; } }
または(array)で配列に変換させてから処理を行う。
$list3 = 'not_array'; foreach( (array)$list3 as $key => $val ) { echo $key .'-'. $val . '<br>'; }
ただこの場合は結果が出力されますので、変数が配列の時のみ処理って場合はis_array()で。
変数が空(Null)か配列かの条件下では有効です。
//(array)$list3で出力するとこうなる 0-not_array
for文の増分は、$i++にしないといけないので
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
のように表さないといけません。
間違えてますよ。
別にいけないことはないでしよ。