2016-08-24 7 views
2

array_filterが呼び出される前に初期化されている配列内の値を比較しようとしています。array_filterのコールバック関数内で空でない配列がnullになる

配列が空ではありませんが、コントロールがarray_filterのコールバック関数内を流れるとき、配列はnullに等しくなります。これの理由は何でしょうか?

$stream = $stream_list[$i]['@attributes']; // IS ARRAY 

$chargeable_feature = array_filter($applicable_conversions,function($conversion) { 
    return $conversion['FeatureName'] == $stream['FeaturesUsed']; 
    // STREAM BECOMES NULL HERE 
}); 
+0

異なるスコープがあります。 $ streamも無名関数に渡してみてください。 –

+1

$ streamはコールバック関数の範囲外です....おそらく 'function($ conversion)use($ stream){' –

答えて

2

あなたはそれが別のスコープにあるのは、関数内$streamを使用することはできません。

使用構文を使用して考えてみましょう。また、閉鎖として知ら

$chargeable_feature = 
array_filter($applicable_conversions,function($conversion) use ($stream) { ... 

Anonymous functions

匿名関数は、何も指定された名前を持っていない 機能の作成を可能にします。

クロージャは、親スコープから変数を継承することがあります。そのような 変数は、の言語構造に渡す必要があります。

そして使用とグローバル変数のスコープの違いに注意してください。

親スコープから変数を継承 グローバル変数を使用するのと同じではありません。グローバル変数はグローバルスコープ内に存在し、実行されている関数にかかわらず同じである です。 クロージャの親スコープは、クロージャが宣言された関数です( は必ず呼び出された関数ではありません)。

3
$stream = $stream_list[$i]['@attributes']; // IS ARRAY 

$chargeable_feature = array_filter($applicable_conversions,function($conversion) use ($stream) { 
    return $conversion['FeatureName'] == $stream['FeaturesUsed']; 
}); 
+1

ようこそ!このコードスニペットは問題を解決するかもしれませんが、[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – Rizier123

+0

よろしくお願いします。 – Vuer

関連する問題