我在使用 usort 函数时遇到问题。我的数组具有以下模型:
Fusion
|
| Array_1
| |
| | Array_1_1
| | | clock => "08:08"
| | | //Other fields
| | |
| |
| | Array_1_2
| | | clock => "04:51"
| | | //Other fields
| | |
|
| Array_2
| ...
我想根据"时钟"字段对Array_X数组进行排序。我基于 usort 的 PHP 文档(第 4 个示例)编写了这段代码:
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
你有什么想法吗?感谢您的帮助。
您正在尝试将以下内容作为回调传递(usort 的第二个参数)
function ($key = 'clock'){
return function ($a,$b) use ($key){
return strnatcmp($a[$key],$b[$key]);
};
}
但文档明确指出
比较函数必须返回一个整数 [...]
但是,您的回调会返回另一个闭包。这就是为什么你会得到一个闭包到 int 转换异常。
我相信您要做的是执行内部闭包以使用正确的值获得最终回调。我会说这是无用的,因为与Javascript不同,php闭包是选择加入的,而不是全部的,这意味着它们的上下文必须包含在use
中,就像你在外部闭包中为$key
所做的那样。
您可以简单地执行以下操作:
$key = 'clock';
foreach ($fusion as $fus){
usort($fus,function ($a,$b) use ($key){
return strnatcmp($a[$key],$b[$key]);
});
}
如果$key
来自某种其他类型的上下文,您可能只需要调整变量赋值。
首先使用 get_object_vars($object)
将对象转换为数组。
如果您获取的对象是由其他函数生成的,请阅读该函数的文档并找到一种返回数组而不是对象的方法。
可在此处找到示例和文档 http://php.net/manual/en/function.get-object-vars.php