php - 在 PHP 中按自定义顺序重新排列对象数组

标签 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;
        }
    }
}

最佳答案

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

重要的功能是:

关于php - 在 PHP 中按自定义顺序重新排列对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13692687/

相关文章:

php - 使用 foreach 创建 PHP 关联数组时如何为键分配名称?

php - 将其他页面的内容嵌入到我自己的页面上有哪些可能性

php - 使用 mod_rewrite 隐藏 URL 末尾的 .php

c - For循环不将数组内的特殊字符识别为单个字符

jquery - 如何在 NodeJS 中更新 JSON 中的值并过滤以排除值?

JavaScript:排序集合,它不是数组

PHP MySQL更新只更新一行

performance - 有限排序/过滤算法

c# - 按其包含的项目对项目进行分组

java - 如何在Java中初始化嵌套的匿名数组double?