使用回调函数

时间:2010-11-24 09:47:01

标签: php

从php手册中读取abt array_filter()时,来到了面向示例的示例 使用回调函数的相同函数如下所示

<?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函数调用,实际参数传递,工作? 任何关于回调的链接都将是很有帮助的。

3 个答案:

答案 0 :(得分:1)

在给出的两个示例中,array_filter将遍历传递的数组中的值,并将其中的每个值发送到回调函数(oddeven)。然后,回调函数将检查该值以查看它是奇数还是偶数并返回TRUEFALSE。如果它返回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”的函数应用于每个元素;此函数将返回一个布尔值,以便您知道要保留什么以及丢弃什么。