通过PHP中的自定义顺序重新排列对象数组

时间:2012-12-03 22:12:12

标签: php arrays sorting

如何重新排序对象数组,如:

Array
(
    [0] => stdClass Object
        (
            [term_id] => 3
            [name] => Name
        )
    [1] => stdClass Object
        (
            [term_id] => 1
            [name] => Name2
        )
    [2] => stdClass Object
        (
            [term_id] => 5
            [name] => Name
        )
)

根据对象term_id,针对自定义的id数组:

  

$ order_by = array(5,3,1)

我现在使用的是下面的内容,但我觉得我没有利用PHP的一些高级排序功能......谁能告诉我什么会更好?

$sorted_terms = array();
$order_by = array( 5,3,1 );

foreach( $order_by as $id ) {
    foreach ( $terms as $pos => $obj ) {
        if ( $obj->term_id == $id ) {
            $sorted_terms[] = $obj;
            break;
        }
    }
}

2 个答案:

答案 0 :(得分:5)

基本上,排序顺序中的术语等级与其对应的ID的等级相同,后者恰好是$order_by数组中的数组键。因此,我们只需要翻转该数组以获取ID到排名的映射,然后使用自定义比较函数对其进行排序。

这是一个应该有效的简单代码片段:

<?php

   $skeys = array_flip($order_by);
   usort($terms,
             function($a,$b) use ($skeys){$a =  $skeys[$a->term_id]; $b = $skeys[$b->term_id]; return $a - $b;});

以上代码适用于PHP 5.3或更高版本。

这与前5.3 PHP相同:

 <?php

   $skeys = array_flip($order_by);
   function sfun($a,$b){
       global $skeys;
       $a =  $skeys[$a->term_id]; $b = $skeys[$b->term_id]; return $a - $b;
   }

   usort($terms, "sfun");

重要的功能是:

答案 1 :(得分:1)

这是comparision of available PHP sorting functions。在您的情况下,您需要使用自己的比较器 - 其中一个“排序顺序”标记为“用户定义”,很可能是uasort()usort()

修改

自定义比较器必须返回-1或0或+1。但是由比较器来决定它对于两个对象是否相等或者更小或者更大并且用什么逻辑规则来判断它究竟意味着什么。所以你只需编程你的逻辑,即如果对象A比你的逻辑规则大于B,则返回+1。这并不意味着A在数学意义上更大。如果我将苹果与自行车进行比较并且我的比较器返回+1,那么这意味着苹果比自行车更大。我是这么说的。我的逻辑。周期。

所以,基本上,如果你可以将你的逻辑变成算法,那么你可以编写一个由该逻辑/算法引导的代码作为比较器来提供你想要的顺序。