2

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

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 = 数组(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;
        }
    }
}
4

2 回答 2

6

基本上,您的术语在其排序顺序中的排名与其对应的 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");

重要的功能是:

于 2012-12-03T22:32:31.400 回答
1

这是可用的 PHP 排序函数的比较。在您的情况下,您需要带有自己的比较器的东西-其中一个带有“排序顺序”标记为“用户定义”的东西,最有可能uasort()usort()

编辑

自定义比较器必须返回 -1 或 0 或 +1。但是由比较器决定两个对象彼此相等或小于或大于彼此的真正含义以及使用哪些逻辑规则来判断。因此,您只需要编写您的逻辑,即如果对象 A 大于 B 根据您的逻辑规则返回 +1。这并不意味着 A 在数学意义上更大。如果我将苹果与自行车进行比较,我的比较器返回 +1,那么这意味着苹果大于自行车。我是这么说的。我的逻辑。时期。

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

于 2012-12-03T22:17:17.717 回答