2

我确实看过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 进行排序,但是,我想我只是不确定是否必须将体重更改为某种东西?或者它会按原样工作吗?我试过了,但没有任何输出...

4

3 回答 3

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

于 2010-02-18T05:57:10.273 回答
0

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

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

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

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

于 2013-02-16T01:05:06.877 回答
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');
于 2014-05-28T05:29:13.280 回答