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

时间:2016-07-13 14:09:55

标签: php arrays closures usort

使用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
你知道吗?谢谢你的帮助。

2 个答案:

答案 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

找到