PHP的usort无法对类进行排序

17

这是待排序元素的示例数组:

$items = 
    array
      0 => 
        object(stdClass)[8]
          public 'id' => string '110' (length=3)
          public 'brand_id' => string '18' (length=2)
            array
              0 => string ' OT-708' (length=7)
          public 'failed' => null
          public 'diff' => null
      1 => 
        object(stdClass)[9]
          public 'id' => string '161' (length=3)
          public 'brand_id' => string '18' (length=2)

假设我想按brand_id进行排序。 这是我的 usort 回调函数:

function _compare($itemA, $itemB){

    if ($itemA->brand_id == $itemB->brand_id) {

        return 0; 
    }
    else{
        return strcmp($itemA->brand_id, $itemB->brand_id); //just an example...
    }

}

当我使用 usort($items, '_compare'); var_dump($items); 时,没有任何反应。有什么提示可以用来排除故障吗?

--更新--

好的,我已将问题简化为以下内容:

function cmp($itemA, $itemB){
    return -1;
}

if (usort($items, "cmp"))
                echo 'I just sorted!';
else echo 'Cant sort!';

它总是打印 '无法排序!'


2
这些对象中甚至不存在 brand_name。 - Matthew
3
你是打印 usort 的返回值还是 $items?因为 usort 只有在成功时返回布尔值,否则返回 false。 - GWW
抱歉,大家,我已经更正了示例。 - Ignacio
1
好的,我弄清楚了...我的错误是认为我已经开启了错误报告。所有这些代码,包括函数cmp都在一个类中,所以我一直在得到这个警告,但没有意识到“(!)警告:usort()期望参数2是一个有效的回调,函数'cmp'未找到或无效的函数名...” - Ignacio
2
@ign,很好,现在你可以将你的问题解决方案作为答案插入并接受它,以便于将来有类似问题的读者查看。 - insumity
显示剩余6条评论
3个回答

49

最后,我发现了这个错误的来源。问题是这段代码在一个类里面。

如果是这种情况,那么你应该这样调用usort:

usort($items, array("MyClass", "compare_method"));

此外,如果你的类在一个命名空间中,你应该在usort中列出完整的命名空间。

usort($items, array('Full\Namespace\WebPageInformation', 'compare_method'));

2
谢谢,我也遇到了与uksort相同的问题。文档说uksort将返回true或false,但实际上它返回null。 - lolesque
2
如果其他人仍然有问题,请尝试将您的比较函数设置为“静态”。 - mightimaus
1
您还可以将类名替换为数组中的第一个元素$this。这相当于$this->compare_method($a, $b),因此请确保该函数设置为“public”。否则,usort 将尝试执行MyClass::comapre_method($a, $b),因此请确保该函数被设置为静态。 - Richard Parnaby-King

2
此外,您可以在类中设置一个静态函数:
static myfunction($a, $b){'yoursort'}

然后像这样调用:

usort($items, "Class::myfunction");

2

如果您在Class中使用usort,则还可以使用$this

usort($my_array, array($this, 'orderByDate'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接