0

ラムダ構文を使用して、PHP で配列フィルター関数を使用して並べ替え/フィルター スクリプトを作成しようとしています。

これは私がやりたいことを達成しますが、最適化できるようです:

$offersReceivedProcessedByItem = array();
  foreach ($this->currentSessionUser->items as $item) {
    $receivedOffersOnItem = array();
    foreach ($offersReceived as $offerReceived) {
     if ($offerReceived->item->id === $item->id) {
       $receivedOffersOnItem[$offerReceived->id] = $offerReceived;
     }
    }
  offersReceivedProcessedByItem[$item->id] = $receivedOffersOnItem;
}

(ユーザーが持っているアイテムごとに、offersReceived 配列をフィルター処理し、同じ ID を持っている場合はオファーを新しい配列に追加します。それが理にかなっていますか?!)。

これが私が試していることです:

$offersReceivedProcessedByItem = array();
foreach ($this->currentSessionUser->items as $item) {
   $receivedOffersOnItem = array_filter($item->offers, function($offer){
     return $offer->item->id === $item->id;
   });
   $offersReceivedProcessedByItem[$item->id] = $receivedOffersOnItem;
}

しかし、$item が未定義であることがわかりました。クローズド スコープだと予想されるため、$item を別の引数として渡そうとしましたが、「引数 2 がありません」と表示されます。

Fuel に組み込まれているリレーショナル アプローチを使用してこれを試しましたが、PHP はメモリを消費しすぎて失敗します。

何か助けはありますか?私は何を間違えていますか?

4

1 に答える 1

2

クロージャーは、あなたがそれを言わない限り、それが作成された環境について何も知りません

$receivedOffersOnItem = array_filter($item->offers, function($offer) use($item){
   return $offer->item->id === $item->id;
});

-ステートメントに注意してuseください

マニュアルへのリンクhttp://php.net/functions.anonymous#example-119

于 2013-02-14T21:27:49.857 に答える