PHPの配列操作
array_map
はもはやアンチパターンとして認識されている匂いがする
黙って foreach
で書けよという感じらしい
array_map(callback, array)
array_filter(array, callback)
明らかに要素数が1個の配列だとしても arr[0]
でアクセスした場合にerrorになることがある
なぜなら、要素数が一つでも、indexが0であるとは限らないから
Array({[1] => 'hoge'})
というような配列がアリうる
代替案
自作Collection Classを用意する
プロダクトごとに用意するのか?
できることならdefaultの機能だけでどうにかしたい

どうしてもdefaultがゴミならこれを採用する
evalのために内部がstringになるのも酷い
パフォーマンス的にも良くない
array()
と []
の違い
配列の初期化
同じらしい
5.4から後者が使えるようになった
array_push
の使い所
$arr[] = $hoge
で入るのに、わざわざarray_pushを使う必要があるのか
ないらしい
というか関数呼び出しoverheadがない分 arr[] = hoge
の方がいい
array_pushは複数の値を同時に追加できる
phparray_push($arr, $hoge, $piyo);
concatするわけではなく、あくまでも複数要素を同時追加したいときにちょっと嬉しい
使う機会ほぼなさそうだな

配列の結合をする
配列以外を引数に入れると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();
それ以外のときはいけるのに
代入するやつ
引数に文字列の関数名を取るやつ
phpfunction compare_by_area($a, $b) {
...
}
print_r(array_udiff($array1, $array2, 'compare_by_area'));
これをclass methodでどうやるかというとこうなる
phpclass Hoge {
function f() {
array_udiff($a, $b, [$this, 'compare'])
}
private function compare(..) {
...
}
}
[$this, 'compare']
という感じで配列と文字列で指定する
頭おかしい
