在php中使用usort来排序对象数组?

时间:2010-02-18 05:52:02

标签: php object sorting 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排序,但是,我想我不确定我是否必须改变体重?或者它会按原样工作吗?我试过了,但没有输出......

3 个答案:

答案 0 :(得分:6)

cmp是一个回调函数,用于比较复杂对象(如你的)以找出如何对它们进行排序。修改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

答案 1 :(得分:0)

我一直在努力写一个比较函数三个小时。实际上这很容易,但我认为我错过了一些东西,并且从头开始一次又一次地改写算法,在很多方面用我的样本数组测试它。

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

当剩余切片是一个项目时,上下索引是相同的,并且函数认为它已经完成(处理所有项目),尽管最后一个项目未被评估。当最内部块具有奇数时,使用该算法的排序函数失败。它运行良好的2,4,8 ....元素,但不能使用3,5,7等...失败的确切条件取决于元素排序顺序。数字可能并不总是有意义的。

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

答案 2 :(得分:0)

对于get属性stdClass对象使用运算符 - &gt; {&#39; name_property&#39;},例如$ a-&gt; {&#39; tid&#39;}

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');