2016-08-01 9 views
0

多次元配列を取得するAPI呼び出しを行っています。私は特定の終了日を持つ特定の配列を取得しようとするarray_filterを使用しています。私が使用しているコードは以下の通りです:文字列変数を使用すると、匿名関数で文字列の比較に失敗する

$api_call = "287/terms"; 

$terms_json = curl_exec(makeAPIConnection($api_call)); 
$all_terms = json_decode($terms_json); 

if(!is_array($all_terms)) { return NULL; } 

// Getting current date and formatting for comparison 
$current_date = date_create('2017-05-25'); 
$date_formatted = date_format($current_date, 'Y-m-d'); 

// Getting the current term 
$current_term = array_filter($all_terms, function($a) { 
    if(substr($a->EndDate, 0, 10) === $date_formatted) { 
     return true; 
    } 
    return false; 
}); 

echo "<pre>"; 
var_dump($date_formatted) . "<br"; 
var_dump($current_term) . "<br"; 
echo "</pre>"; 

このコードはこれを返します。

string(10) "2017-05-25" 
array(0) { 
} 

私が代わりに匿名関数で文字列リテラルを使用している場合...

$current_term = array_filter($all_terms, function($a) { 
    if(substr($a->EndDate, 0, 10) === '2017-05-25') { 
     return true; 
    } 
    return false; 
}); 

私はこれを取得。

string(10) "2017-05-25" 
array(1) { 
    [3]=> 
    object(stdClass)#4 (7) { 
    ["AcadSessionId"]=> 
    int(287) 
    ["Code"]=> 
    string(4) "Qtr4" 
    ["Description"]=> 
    string(20) "Quarter 4/Semester 2" 
    ["EndDate"]=> 
    string(19) "2017-05-25T00:00:00" 
    ["Id"]=> 
    int(729) 
    ["Name"]=> 
    string(20) "Quarter 4/Semester 2" 
    ["StartDate"]=> 
    string(19) "2017-03-13T00:00:00" 
    } 
} 

文字列変数の使用に失敗し、文字列リテラルが動作している理由を教えていただけますか?

答えて

1

エラー報告を無効にしないでください。そうしないと、$date_formattedが定義されていないという通知が表示されます。

$date_formattedは、匿名機能のコンテキスト内に存在しません。あなたはuseを使用して、親スコープから変数を継承することができます。

$current_term = array_filter($all_terms, function($a) use ($date_formatted) { 
    if(substr($a->EndDate, 0, 10) === $date_formatted) { 
     return true; 
    } 
    return false; 
}); 

詳しい情報はhttp://php.net/manual/en/functions.anonymous.php

で見つけることができます
関連する問題