2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

array_filterでarray?ってなったお話

Posted at

前置き

  • 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後の配列のキーはそのまま」ということを意識する
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?