PHPの配列操作
array_mapはもはやアンチパターンとして認識されている匂いがする
黙ってforeachで書けよという感じらしい
array_map(callback, array)
array_filter(array, callback)
他の言語よりもインデックスアクセスは注意しないといけないmrsekut.icon*4
明らかに要素数が1個の配列だとしてもarr[0]でアクセスした場合にerrorになることがある
なぜなら、要素数が一つでも、indexが0であるとは限らないから
Array({[1] => 'hoge'})というような配列がアリうる
代替案
自作Collection Classを用意する
プロダクトごとに用意するのか?
できることならdefaultの機能だけでどうにかしたいmrsekut.icon
どうしてもdefaultがゴミならこれを採用する
evalのために内部がstringになるのも酷い
パフォーマンス的にも良くない
array()と[]の違い
配列の初期化
同じらしい
5.4から後者が使えるようになった
array_pushの使い所
$arr[] = $hogeで入るのに、わざわざarray_pushを使う必要があるのか
ないらしい
というか関数呼び出しoverheadがない分arr[] = hogeの方がいい
array_pushは複数の値を同時に追加できる
code:php
array_push($arr, $hoge, $piyo);
concatするわけではなく、あくまでも複数要素を同時追加したいときにちょっと嬉しい
使う機会ほぼなさそうだなmrsekut.icon
配列の結合をする
配列以外を引数に入れると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は型エラーにならない
code:php
/**
* @param array|null $arr
*/
private function piyo($arr): void {
$newIds = array_map(function ($n) { return ..; }, $newList); // no error
...
この記法、arrが空配列のときにエラーになる。
code:aa.php
それ以外のときはいけるのに
代入するやつ
引数に文字列の関数名を取るやつ
code:php
function compare_by_area($a, $b) {
...
}
print_r(array_udiff($array1, $array2, 'compare_by_area'));
これをclass methodでどうやるかというとこうなる
code:php
class Hoge {
function f() {
}
private function compare(..) {
...
}
}
[$this, 'compare']という感じで配列と文字列で指定する
頭おかしいmrsekut.icon