我确实看过了,但我仍然有点困惑......
这是$ 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排序,但是,我想我不确定我是否必须改变体重?或者它会按原样工作吗?我试过了,但没有输出......
答案 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');
答案 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');