7

我正在尝试创建一个函数来启动 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...

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

我不确定作用域如何与函数内部的函数一起工作,但如果我没记错的话,这是可能的。我尝试投入一些globals 并进行初始化$key2,但我无法让它工作。

4

2 回答 2

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'));
}
于 2012-09-04T04:30:12.690 回答
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);
于 2012-09-04T04:46:13.167 回答