将函数参数传递给内部函数?

时间:2012-09-04 04:23:43

标签: php

我正在尝试创建一个函数来启动date_compare(),它是特定数组和键的usort函数。

function init_date_compare($key, $array) {
    $key2 = $key;
    function date_compare($a, $b) {
        global $key2;
        $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]);
        return $t2 - $t1;
    }
    usort($array, "date_compare");
}
$arr = array(array("Aug-2-2012"), array("June-2-2012"));
$arr = init_date_compare(0, $arr);
print_r($arr);

输出:

Notice: Undefined index: in...

(所以基本上是空的,范围界定不起作用)。

我不确定范围如何与函数内部的函数一起使用,但是如果我没记错的话,它是可能的。我尝试投入一些global并初始化$key2,但我无法让它发挥作用。

2 个答案:

答案 0 :(得分:4)

您的代码无效的原因是因为global $key2;函数中的date_compare()不会在范围init_date_compare()内查找它;相反,它会期望在全球范围内找到它。

除此之外,数组应该通过函数参数通过引用传递(即&$array),或者应该从中返回数组。

闭包会使这个更好(PHP> = 5.3):

function init_date_compare($key, &$array)
{
    usort($array, function(array $a, array $b) use ($key) {
        $t1 = strtotime($a[$key]); $t2 = strtotime($b[$key]);
        return $t2 - $t1;
    });
}

另一种方法是使用对象封装状态:

class DateComparer
{
    private $key;

    public function __construct($key)
    {
        $this->key = $key;
    }

    public function compare(array $a, array $b)
    {
        $t1 = strtotime($a[$this->key]); $t2 = strtotime($b[$this->key]);
        return $t2 - $t1;
    }
}

function init_date_compare($key, &$array)
{
    usort($array, array(new DateComparer($key), 'compare'));
}

答案 1 :(得分:1)

当然杰克的回答是做事的正确方法,但万一你想知道为什么它首先不起作用:
声明$key2作为全局变量只是一个问题,另一个问题是函数init_date_compare不返回已排序的数组 以下代码将起作用:

$key2=0;

function init_date_compare($key, $array) {
    global $key2;
    $key2 = $key;
    function date_compare($a, $b) {
        //global $key2;
        $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]);
        return $t2 - $t1;
    }
    usort($array, "date_compare");
    return $array;
}
$arr = array(array("Aug-2-2012"), array("June-2-2012"));
$arr = init_date_compare(0, $arr);
print_r($arr);