元々Javaを触っていて、最近はPHPのLaravel+VueでのMPAっぽいものの開発を行っています。
※MPA(Multi Page Application)はSPA(Single Page Application)と対比して使われている言葉です。イメージとしてはテンプレートエンジンとフロントのフレームワーク(VueやReact等々)とを併用して、必要な部分だけフロントのフレームワークを使用して開発します。
今回のお話は要約すると
CollectionでfilterしたものをAPIのもどりで返すときは最後にvalues()をつけて返そう
ってお話です。
LaravelでAPIの戻りとして配列の値を返してVueで処理をしていたのですが、javascript側のArray系のメソッド(mapやfilterを愛用しているので)の部分で落ちていることがたまにあり、その時なぜかObjectがネストして入ってきていました。
※以下イメージ
[
{
a: 'a',
},
{
b: 'b',
},
]
を想定していたのに
{
{
a: 'a',
},
{
b: 'b',
},
}
で返ってきてた。
そしてその原因がPHP側のCollection.filterにあった。
Collectionのfilterを使うと元の配列から該当する箇所を抜き出した配列を返す動きらしい。
[
0 => 'a',
1 => 'b',
2 => 'c',
]
これをcollect(上の配列).filter(function ($v) { return $v == ‘a’ || $v == ‘c’;});
とかで実行すると
[
0 => 'a',
2 => 'c',
]
のような形で返ってくる。(なんでやねん。。。)
それで、インデックスが歯抜けの配列を戻り値として使うとObjectと解釈して返してしまうとのこと。
解消法としてはvalues()するとインデックスが連番のもので返せる。
こうすればOK
collect(上の配列).filter(function ($v) { return $v == ‘a’ || $v == ‘c’;})->values();
[
0 => 'a',
1 => 'c',
]
最近PHPと仲良くなれた気がしたんですが、また心の距離ができました。