2014-04-10 38 views
-1

我有一個關聯數組的數組,如下所示。使用回調自定義array_filter

$list = array(
    array("animal" => 0, "color" => 0, "coins" => 10), 
    array("animal" => 0, "color" => 1, "coins" => 20), 
    array("animal" => 0, "color" => 2, "coins" => 10), 
    array("animal" => 1, "color" => 0, "coins" => 55), 
    array("animal" => 1, "color" => 1, "coins" => 25), 
    array("animal" => 1, "color" => 2, "coins" => 10) 
); 

我想過濾陣列保持僅當「硬幣」 < 30,所以我嘗試。

function less_than_10($var) { 
    return ($var < 30); 
} 

array_filter($list, "less_then_10"); 

但它沒有按照我預期的方式工作,請指導如何通過指定數組的過濾密鑰進行過濾。

+3

你有一個錯字有..它應該是'less_than_10 ' –

回答

3

三個要點進行:

  • 你有一個多維數組,所以你需要改變return ($var < 30);return ($var['coins'] < 30);

  • array_filter()返回該數組。您將不得不將返回值存儲到一個變量中,以便稍後使用它。

  • 您在回撥函數中有一個錯字less_then_10應該是less_than_10

修改後的代碼:

function less_than_30($arr) { 
    return ($arr['coins'] < 30); 
} 

$result = array_filter($list, "less_than_30"); 
print_r($result); 

如果回調函數只用過一次,你可以使它成爲一個匿名函數,像這樣:

$result = array_filter($list, function ($arr) { 
    return ($arr['coins'] < 30); 
}); 

乾淨多了,對?但是,現在這個功能有點毫無意義的,因爲你不能檢查超過30其它值可以使用use塊擴展其功能:

$min = 10; // Change this value as necessary 

$result = array_filter($list, function ($arr) use ($min) { 
    return ($arr['coins'] < $min); 
}); 
+1

很好的答案。我正要添加一個「使用」的例子,但我看到你做了它,並不想複製:P。 –

+0

您剛剛涵蓋了包括我未來的所有問題,謝謝:P – Artisan

4

您可以使用PHP> = 5.3中的closure(或匿名函數)來完成此操作。

$list = array_filter($list, function($a) { 
    return $a['coins'] < 30; 
}); 

而且,尚卡爾達莫達倫在他的評論中說,你調用array_filter()當有一個錯字在你的函數名。

Here is a great explanation for closures in PHP 5.3

+1

僅供參考,儘管匿名函數對此非常有用,但使用常規函數也可以。真正的解決方法是在過濾器函數比較什麼,以及來自'array_filter'的返回值做了什麼。 – cHao

+1

+1:這是正確的。但我不確定OP是否希望獲得硬幣值小於30或10的子陣列。 –

+0

您是對的..感謝您的輸入!嘿,這是一場雙贏的勝利,因爲我們三人都是對的! :) –