使用回调自定义array_filter


Custom array_filter using callback

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

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

我想过滤数组以仅在"coins"<30,所以我试过了。

function less_than_10($var) {
  return ($var < 30);
}
array_filter($list, "less_then_10");

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

您可以在PHP>=5.3中使用闭包(或匿名函数)来实现这一点。

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

此外,正如Shankar Damodaran在评论中所说,当调用array_filter()时,您的函数名称中确实存在拼写错误。

以下是对PHP5.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);
});