【问题标题】:Using usort in php to sort an array of objects?在 php 中使用 usort 对对象数组进行排序?
【发布时间】:2011-01-18 04:47:33
【问题描述】:

我确实看过usort,但还是有点糊涂……

这是 $myobject 对象的样子:

Array
(
    [0] => stdClass Object
        (
            [tid] => 13
            [vid] => 4
        )

    [1] => stdClass Object
        (
            [tid] => 10
            [vid] => 4
        )

    [2] => stdClass Object
        (
            [tid] => 34
            [vid] => 4
        )

    [3] => stdClass Object
        (
            [tid] => 9
            [vid] => 4
        )

我看到了这个:

function cmp( $a, $b )
{ 
  if(  $a->weight ==  $b->weight ){ return 0 ; } 
  return ($a->weight < $b->weight) ? -1 : 1;
} 
usort($myobject,'cmp');

我正在尝试根据 tid 进行排序,但是,我想我只是不确定是否必须将重量更改为某些东西?或者它会按原样工作吗?我试过了,但没有任何输出...

【问题讨论】:

    标签: php object sorting usort


    【解决方案1】:

    cmp 是一个 callback 函数,usort 使用它来比较复杂对象(如您的对象)以确定如何对它们进行排序。修改 cmp 以供您使用(或将其重命名为您想要的任何名称)

    function cmp( $a, $b )
    { 
      if(  $a->tid ==  $b->tid ){ return 0 ; } 
      return ($a->tid < $b->tid) ? -1 : 1;
    } 
    usort($myobject,'cmp');
    
    function sort_by_tid( $a, $b )
    { 
      if(  $a->tid ==  $b->tid ){ return 0 ; } 
      return ($a->tid < $b->tid) ? -1 : 1;
    } 
    usort($myobject,'sort_by_tid');
    

    http://www.php.net/usort

    【讨论】:

    • 好的,感谢您的解释,但它仍然无法正常工作......我不允许将它分配给变量或其他东西吗?因为当我执行 $myobject = usort($myobject, 'cmp') 时,它根本不输出任何东西?我假设我只需要上面的一个或其他功能,而不是两者,因为它们都做同样的事情?
    • 另外,我也尝试将这两个变量重命名为 $myobject1 和 $myobject2 = usort...但这也没有用...
    • 没关系!应该在发布之前尝试不分配它...谢谢!
    • usort 是少数几个将指针作为输入(非常 C-ish 风格)并返回布尔值的 php 函数之一。查看 PHP 文档页面。试着把 usort($myobject, 'cmp') 然后检查 $myobject 有什么。
    【解决方案2】:

    我已经尝试编写一个比较函数三个小时了。事实上这很容易,但我认为我错过了一些东西,并从头开始一次又一次地编写它,以多种方式用我的样本数组测试它。

    最后我意识到问题出在内部 uasort 函数上。它没有完成与所有项目的比较。我现在不记得所用算法的名称,但我自己使用 C++ 中的改进版本(我的)。该算法使用类似于二叉树的比较方法,通过将数组划分为每次递归调用具有新索引(下限、上限)的排序函数所需的多对。

    当剩余的切片是一个项目时,上下索引相同,并且函数认为它已经完成(处理了所有项目),尽管最后一个项目没有被评估。当最里面的块有奇数时,使用该算法的排序函数会失败。它可以正常工作 2、4、8 .... 元素,但不能使用 3、5、7 等...失败的确切情况取决于元素排序顺序。数字可能并不总是有意义的。

    几年前我就解决了这个问题。我现在无法为 PHP 自己解决它,因为我没有 PHP 编译器,也没有 PHP 源代码。但是,如果 PHP 开发团队的任何人与我联系,我可以提供 C++ 中该算法的工作副本。相同的算法是访问已排序元素的最快方法。

    【讨论】:

      【解决方案3】:

      获取属性stdClass对象使用操作符->{'name_property'},例如$a->{'tid'}

      function cmp( $a, $b )
      { 
        if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
        return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
      } 
      usort($myobject,'cmp');
      
      function sort_by_tid( $a, $b )
      { 
        if(  $a->{'tid'} ==  $b->{'tid'} ){ return 0 ; } 
        return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1;
      } 
      usort($myobject,'sort_by_tid');
      

      【讨论】:

        最近更新 更多