前置き
- array_filter は何か便利そうだが、よく分かっていないので使っていないまま
- 使えるようになりたい!ので整理する
array_filter とは?
callback 関数によりフィルタ処理が行われた array の全ての要素を含む配列を返します。 callback 関数が TRUE を返した場合、 array の現在の値が結果の配列に入ります。 配列のキーは保存されます。
引用元 : PHP_ array_filter - Manual
- ・・ざっくり「第二引数でtrueを返したものだけを配列として返す(それ以外は削除する。配列のキーはそのまま)」
使ってみた
$ary = [0, 1, 2, 2, 3];
$tmpAry = (array_filter($ary, function($num){
return $num == 2;
}));
for($i=0; $i<count($tmpAry); $i++){
var_dump($tmpAry[$i]);
}
/* 出力結果 :
NULL
NULL
*/
NULL??
- array_filterでフィルタリングした内容をvar_dumpで出力し、値を確認してみます
$ary = [0, 1, 2, 2, 3];
$tmpAry = (array_filter($ary, function($num){
return $num == 2;
}));
var_dump($tmpAry);
/* 出力結果 :
array(2) {
[2]=>
int(2)
[3]=>
int(2)
}
*/
検証結果
- フィルタに引っかかったものだけが(配列のキーはそのままに)残る
- 上の例では、0番目と1番目が存在しないので NULL と出力された
- 次:空いている要素を埋めたいので
array_merge
を使う
array_merge とは?
前の配列の後ろに配列を追加することにより、 ひとつまたは複数の配列の要素をマージし、得られた配列を返します。
(中略)
入力配列の中にある数値添字要素の添字の数値は、 結果の配列ではゼロから始まる連続した数値に置き換えられます。
引用元 : PHP_ array_merge - Manual
- ・・ざっくり「配列を結合し、添え時の数値は0から振り直してくれる」(結合対象の配列がない場合は前者は無効、後者は有効)
使ってみた
$ary = [0, 1, 2, 2, 3];
$tmpAry = (array_filter($ary, function($num){
return $num == 2;
}));
var_dump($tmpAry);
/* 出力結果 :
array(2) {
[0]=>
int(2)
[1]=>
int(2)
}
*/
$tmpAry = array_merge($tmpAry);
for($i=0; $i<count($tmpAry); $i++){
var_dump($tmpAry[$i]);
}
/* 出力結果 :
int(2)
int(2)
*/
まとめ
- array_filter後にfor文を制御変数で回す場合は、まずarray_mergeで空いている要素を前に詰める
- foreachで回す場合も、「array_filter後の配列のキーはそのまま」ということを意識する