使用usort函数时遇到问题。我的阵列有以下型号:
Fusion
|
| Array_1
| |
| | Array_1_1
| | | clock => "08:08"
| | | //Other fields
| | |
| |
| | Array_1_2
| | | clock => "04:51"
| | | //Other fields
| | |
|
| Array_2
| ...
我想基于'clock'字段对Array_X中的数组进行排序。我根据usort(第4个例子)的PHP文档制作了这段代码:
foreach ($fusion as $fus){
usort($fus,function ($key = 'clock'){
return function ($a,$b) use ($key){
return strnatcmp($a[$key],$b[$key]);
};
});
}
...但它返回以下异常:
Object of class Closure could not be converted to int
你知道吗?谢谢你的帮助。
答案 0 :(得分:2)
您尝试将以下内容作为回调传递(usort的第二个参数)
function ($key = 'clock'){
return function ($a,$b) use ($key){
return strnatcmp($a[$key],$b[$key]);
};
}
但文件明确指出
比较函数必须返回一个整数[...]
但是,你的回调会返回另一个闭包。这就是为什么你得到一个Closure到int convertion Exception。
我相信你要做的是执行内部闭包以使用正确的值获得最终回调。我说这没用,因为与Javascript不同,php闭包是选择加入,而不是全押,这意味着他们的上下文必须与use
$key
一样包含在$key = 'clock';
foreach ($fusion as $fus){
usort($fus,function ($a,$b) use ($key){
return strnatcmp($a[$key],$b[$key]);
});
}
中在外封闭。
你可以这样做:
$key
如果from a join
b
on right(a.dob, 4) = right(b.dob, 4) and -- compare years
left(a.dob, 2) = substring(b.dob, 3, 2) and -- compare months
substring(a.dob, 3, 2) = left(b.dob, 2) -- compare days
来自其他某种情境,您可能只需调整变量分配。
答案 1 :(得分:-2)
首先使用get_object_vars($object)
将对象转换为数组。
如果您获得的对象是由另一个函数生成的,那么请阅读该函数的文档,并找到一种方法来返回数组而不是对象。
示例和文档可以在http://php.net/manual/en/function.get-object-vars.php
找到