PHP:类闭包的对象无法转换为 int


PHP: Object of class Closure could not be converted to int

我在使用 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