2010-02-18 124 views
1

我没看usort,但还是有点迷茫......在php中使用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进行排序,但是,我想我只是不确定是否必须改变重量到某些东西?或者它会按原样工作?我试过了,但没有输出...

回答

6

cmp是一个回调函数,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

+0

好,感谢解释,但它仍然没有工作...我不允许将它分配给变量或其他东西吗?因为当我做$ myobject = usort($ myobject,'cmp')时,它根本不输出任何内容?我假设我只需要一个或上面的其他功能,而不是两个,因为他们都做同样的事情? – andy787899 2010-02-18 06:05:06

+0

此外,我也尝试将两个变量重命名为$ myobject1和$ myobject2 = usort ...但这也不起作用... – andy787899 2010-02-18 06:06:01

+0

没关系!应该只是尝试不发布之前发布......谢谢! – andy787899 2010-02-18 06:09:18

0

我一直想写一个比较函数了三个小时。事实上这很容易,但是我认为我错过了一些东西,并且通过很多方式从头开始改变算法一次又一次地写下来,用我的样本数组对其进行测试。

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

当剩余片是一个项目,然后上下指标是一样的,功能认为它已经完成(处理所有项目),虽然最后一个项目未评价。当最内层的块具有奇数时,使用该算法对函数进行排序失败。它工作正常2,4,8 ....元素,但不能与3,5,7等工作...失败的确切条件取决于元素排序顺序。数字并不总是有意义的。

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

0

为了获得财产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');