我正在尝试创建一个函数来启动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
,但我无法让它发挥作用。
答案 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);