使用回调自定义array_filter

时间:2014-04-10 05:21:16

标签: php arrays

我有一组关联数组,如下所示。

$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");

但它没有按照我预期的方式工作,请指导如何通过指定数组的过滤键进行过滤。

2 个答案:

答案 0 :(得分:4)

您可以使用PHP中的closure(或匿名函数)&gt; = 5.3。

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

另外,正如Shankar Damodaran在评论中所说,在致电array_filter()时,你在你的函数名中有拼写错误。

Here is a great explanation for closures in PHP 5.3

答案 1 :(得分: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);
});