PHPの配列操作
https://www.php.net/manual/ja/ref.array.php
PHPの無名関数は、外部変数にアクセスするために明示的にuseが必要
array_diff
array_mapはもはやアンチパターンとして認識されている匂いがする
黙ってforeachで書けよという感じらしい
array_mapとarray_filterでの、arrayとcallbackの順序が逆なの意味不明すぎるmrsekut.icon
array_map(callback, array)
array_filter(array, callback)
v7.4でPHPのアロー関数が書けるからまだマシかも知れない
他の言語よりもインデックスアクセスは注意しないといけないmrsekut.icon*4
明らかに要素数が1個の配列だとしてもarr[0]でアクセスした場合にerrorになることがある
なぜなら、要素数が一つでも、indexが0であるとは限らないから
Array({[1] => 'hoge'})というような配列がアリうる
array_diffやarray_filterをした時にハマりがち
代替案
自作Collection Classを用意する
https://qiita.com/Hiraku/items/190443b33ee7a2167ade#配列関数の書き味を改善する
プロダクトごとに用意するのか?
できることならdefaultの機能だけでどうにかしたいmrsekut.icon
どうしてもdefaultがゴミならこれを採用する
evalのために内部がstringになるのも酷い
パフォーマンス的にも良くない
array()と[]の違い
配列の初期化
同じらしい
5.4から後者が使えるようになった
array_pushの使い所
$arr[] = $hogeで入るのに、わざわざarray_pushを使う必要があるのか
ないらしい
というか関数呼び出しoverheadがない分arr[] = hogeの方がいい
https://www.php.net/manual/ja/function.array-push.php
array_pushは複数の値を同時に追加できる
code:php
array_push($arr, $hoge, $piyo);
concatするわけではなく、あくまでも複数要素を同時追加したいときにちょっと嬉しい
使う機会ほぼなさそうだなmrsekut.icon
array_merge
https://www.php.net/manual/ja/function.array-merge.php
配列の結合をする
配列以外を引数に入れるとNULLになる
https://qiita.com/sunnyG/items/6312e44b6b6ee49240f3
in_array()
第3引数を指定しましょう
https://qiita.com/ritukiii/items/3a6add378ae089ab5d70
http://blog.a-way-out.net/blog/2015/12/22/php-array/
array_map
https://qiita.com/tadsan/items/bfd1acb7c35a9a6fe452
https://qiita.com/Hiraku/items/190443b33ee7a2167ade
https://qiita.com/GHKEN/items/7f040e0c1b830eb5baad
methodを引数にするときarray_map(array($this, 'hogeMethod'), $array);と書く
単純な値取得であればarray_columnの方が簡潔に書ける
https://www.php.net/manual/ja/function.array-column.php
jsのhoges.map(h => h.id)程度のmapのときは、
array_column($hoge, 'id')と書く
array_unique
https://www.php.net/manual/ja/function.array-unique.php
1と"1"は重複と見なされる
indexが虫食いになる
array_valuesと組み合わせて回避する
array_fileter
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
'arr' => $arr = $hogepiyo();
それ以外のときはいけるのに
代入するやつ
引数に文字列の関数名を取るやつ
https://www.lanches.co.jp/blog/2701
array_udiffとかは、第3引数に比較用の関数を取るが、これは関数名を文字列で指定する
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() {
array_udiff($a, $b, $this, 'compare')
}
private function compare(..) {
...
}
}
[$this, 'compare']という感じで配列と文字列で指定する
頭おかしいmrsekut.icon
https://qiita.com/Hiraku/items/190443b33ee7a2167ade
https://qiita.com/tadsan/items/bfd1acb7c35a9a6fe452
http://ja.phptherightway.com/pages/Functional-Programming.html