【问题标题】:PHP: Object of class Closure could not be converted to intPHP:类 Closure 的对象无法转换为 int
【发布时间】:2016-11-16 04:22:14
【问题描述】:

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

你有什么想法吗?感谢您的帮助。

【问题讨论】:

  • 你想用function ($key = 'clock')...做什么?

标签: php arrays closures usort


【解决方案1】:

首先使用get_object_vars($object) 将您的对象转换为数组。

如果您获取的对象是由不同的函数生成的,请阅读该函数的文档并找到一种方法让它返回一个数组而不是对象。

示例和文档可以在这里找到http://php.net/manual/en/function.get-object-vars.php

【讨论】:

    【解决方案2】:

    您正在尝试将以下内容作为回调传递(usort 的第二个参数)

    function ($key = 'clock'){
            return function ($a,$b) use ($key){
                return strnatcmp($a[$key],$b[$key]);
            };
    }
    

    但文档明确指出

    比较函数必须返回一个整数 [...]

    但是,您的回调返回另一个闭包。这就是为什么你会得到一个 Closure to 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 来自其他类型的上下文,您可能只需要调整变量分配。

    【讨论】:

    • 没有更多异常,但排序不起作用。我会试着找出原因。
    • 你的意思是,结果不是你所期望的?你至少看到数组的顺序有什么变化吗?您是否证实 strnatcmp 多次按预期工作?
    • 你说得对,strnatcmp 没有返回我预期的结果。现在我将字符串转换为 DateFormat,它返回正确的结果,但我的数组仍然没有变化。这是我的代码:foreach ($fusion as $fus){ usort($fus, function ($a,$b) use ($key){ $date1 = date_create_from_format('H:i',$a[$key]); $date2 = date_create_from_format('H:i',$b[$key]); return ($date1>$date2)?-1:1; }); } 例如: 20:51 > 01:02 ? res=是 08:53 > 20:51 ? res=No EDIT : 我怎样才能放置换行符?
    • 我的数组中的更改似乎没有注册。我将针对这个问题创建另一个帖子。
    猜你喜欢
    • 2013-08-22
    • 2014-11-24
    • 2019-05-02
    • 2017-03-08
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多