一般社団法人 全国個人事業主支援協会

COLUMN コラム

  • 【PHP】Laravel-Collectionのfilterの落とし穴

元々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と仲良くなれた気がしたんですが、また心の距離ができました。

The following two tabs change content below.

新歩一 正己

初めまして。 新歩一と申します。 現在開発系のフリーランスで4年目となります。 新しいもの好きなので色々開発言語は触っております。 Web関係、業務用システム構築がメインでJava, Javascript, PHP, Pythonを使っております。 オリンピック期間は国外逃亡します。(たぶん)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア