generated at
PHPの配列操作


array_map はもはやアンチパターンとして認識されている匂いがする
黙って foreach で書けよという感じらしい
array_maparray_filterでの、 array callback の順序が逆なの意味不明すぎるmrsekut
array_map(callback, array)
array_filter(array, callback)

v7.4でPHPのアロー関数が書けるからまだマシかも知れない


他の言語よりもインデックスアクセスは注意しないといけないmrsekutmrsekutmrsekutmrsekut
明らかに要素数が1個の配列だとしても arr[0] でアクセスした場合にerrorになることがある
なぜなら、要素数が一つでも、indexが0であるとは限らないから
Array({[1] => 'hoge'}) というような配列がアリうる
array_diffarray_filterをした時にハマりがち




代替案
自作Collection Classを用意する
プロダクトごとに用意するのか?
できることならdefaultの機能だけでどうにかしたいmrsekut
どうしてもdefaultがゴミならこれを採用する
evalのために内部がstringになるのも酷い
パフォーマンス的にも良くない


array() [] の違い
配列の初期化
同じらしい
5.4から後者が使えるようになった

array_push の使い所
$arr[] = $hoge で入るのに、わざわざarray_pushを使う必要があるのか
ないらしい
というか関数呼び出しoverheadがない分 arr[] = hoge の方がいい
array_pushは複数の値を同時に追加できる
php
array_push($arr, $hoge, $piyo);
concatするわけではなく、あくまでも複数要素を同時追加したいときにちょっと嬉しい
使う機会ほぼなさそうだなmrsekut


配列の結合をする
配列以外を引数に入れるとNULLになる

in_array()
第3引数を指定しましょう




array_map
methodを引数にするとき array_map(array($this, 'hogeMethod'), $array); と書く
単純な値取得であれば array_column の方が簡潔に書ける
jsの hoges.map(h => h.id) 程度のmapのときは、
array_column($hoge, 'id') と書く



1 "1" は重複と見なされる
indexが虫食いになる
array_valuesと組み合わせて回避する


filter後のindexは、元のarrayのまま
だから例えば [[2]=> 'a', [10] => 'b'] のような結果になる
indexを0からにするためには array_values() に適用するなどする
$arr = array_values($filteredArr)

型で $arr はnullableだと言っているのに、array_mapは型エラーにならない
php
/** * @param array|null $arr */ private function piyo($arr): void { $newIds = array_map(function ($n) { return ..; }, $newList); // no error ...


この記法、arrが空配列のときにエラーになる。
aa.php
['arr' => $arr] = $hogepiyo();
それ以外のときはいけるのに
代入するやつ


引数に文字列の関数名を取るやつ
array_udiffとかは、第3引数に比較用の関数を取るが、これは関数名を文字列で指定する
php
function compare_by_area($a, $b) { ... } print_r(array_udiff($array1, $array2, 'compare_by_area'));
これをclass methodでどうやるかというとこうなる
php
class Hoge { function f() { array_udiff($a, $b, [$this, 'compare']) } private function compare(..) { ... } }
[$this, 'compare'] という感じで配列と文字列で指定する
頭おかしいmrsekut