【问题标题】:PHP usort won't sort classPHP usort 不会对类进行排序
【发布时间】:2011-09-19 04:11:20
【问题描述】:

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

$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!';

它总是打印 'Cant sort!'

【问题讨论】:

  • brand_name 甚至不存在于这些对象中。
  • 您打印的是usort 还是$items 的返回值?因为usort 仅在成功时返回布尔值,否则返回 false。
  • 对不起,伙计们,我更正了这个例子。
  • 好的,我想通了......我认为我有错误报告是我的错误。所有这些代码,包括函数 cmp 都在一个类中,所以我得到了这个并且没有意识到“(!)警告:usort()期望参数2是一个有效的回调,函数'cmp'没有找到或无效的函数名在……”
  • @ign ,很高兴您现在可以插入您的问题解决方案作为答案,并为未来可能遇到类似问题的读者接受它。

标签: php usort


【解决方案1】:

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

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

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

此外,如果您的 Class 在命名空间中,您应该在 usort 中列出完整的命名空间。

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

【讨论】:

  • 谢谢,在 uksort 上遇到了同样的问题。文档说 uksort 将返回 true 或 false,并且它返回 null。
  • 如果其他人仍有问题,请尝试使用您的比较功能static
  • 您也可以将类名替换为$this作为数组中的第一个元素。这相当于$this->compare_method($a, $b),因此请确保将函数设置为public。否则usort 正在尝试执行MyClass::comapre_method($a, $b),因此请确保将函数设置为静态。
【解决方案2】:

此外,您可以在 Class 中设置静态函数:

static myfunction($a, $b){'yoursort'}

然后这样称呼它:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2011-01-18
      • 2018-03-26
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多