<?php
function odd($var)
{
// returns whether the input integer is odd
return($var & 1);
}
function even($var)
{
// returns whether the input integer is even
return(!($var & 1));
}
$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);
echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
?>
你能不能帮助我知道实际的calback函数调用,实际参数传递,工作? 任何关于回调的链接都将是很有帮助的。
答案 0 :(得分:1)
在给出的两个示例中,array_filter
将遍历传递的数组中的值,并将其中的每个值发送到回调函数(odd
或even
)。然后,回调函数将检查该值以查看它是奇数还是偶数并返回TRUE
或FALSE
。如果它返回FALSE
,则从数组中过滤掉该值。
找出函数传递给回调的最简单方法是提供一个打印传递参数的回调,例如
array_filter($anArray, function() { var_dump(func_get_args()) });
回调详见
答案 1 :(得分:1)
想象一下,你有这样的功能:
function getNumbersDivisibleBy3($arr)
{
$threes = array();
foreach($arr as $val)
{
if($val % 3 == 0)
{
$threes[] = $val;
}
}
return $threes
}
此函数过滤掉数组中可被3整除的所有数字,并将它们作为另一个数组返回。
现在想象另一个功能:
function GetWordsStartingWithC($arr)
{
$cs = array();
foreach($arr as $word)
{
if($word[0] == 'C')
{
$cs[] = $word;
}
}
return $cs;
}
此函数从单词数组中过滤出以C
开头的所有单词,并返回另一个数组。
如果你看一下上面的函数,它们的元函数(就像它)可以解释为“这个函数过滤掉满足条件的数组中的所有项,并将它们作为另一个数组返回。”
因此,不必编写相同的样板代码来迭代列表并过滤掉所有匹配的元素,PHP开发人员编写了一个函数,它接受一个数组和一个函数名字符串。
在其他语言中,例如C#,而不是作为函数名的字符串,实际上是传入一个名为委托的对象,它是一个函数的指针或引用。但是在PHP中,他们可以通过你传递的名字来确定你的意思。我不知道那些是什么。
所以array_filter
函数看起来像这样(它不会因为它可能不是用PHP编写的)
function array_filter($arr, $callbackname)
{
$result = array();
foreach($arr as $item)
{
if(call_user_func($callbackname, $item))
{
$result[] = $item;
}
}
return $result;
}
在该函数中,您可以看到它与前两个函数的相似程度,但它不是通过预定义的条件,而是通过您传入的名称回调(使用call_user_func()
函数)要使用的函数。通过将每个项目用作函数的参数,将其应用于数组中的每个项目。
因此,您可以使用array_filter
来减少编写的代码量,因为您不必编写样板迭代代码,只需编写需要过滤的条件函数。
答案 2 :(得分:0)
回调函数是由另一个函数“回调”的函数。在array_filter()
的情况下,为数组的每个元素调用回调,并且该元素是传递给它的参数。您无法控制传递的参数,这是您正在使用的主要功能。
所以你基本上对array_filter()
说:请运行这个数组并将这个名为“odd”的函数应用于每个元素;此函数将返回一个布尔值,以便您知道要保留什么以及丢弃什么。