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

Sha*_*nig 2 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
        )
)
Run Code Online (Sandbox Code Playgroud)

根据对象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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

did*_*erc 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;});
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于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");
Run Code Online (Sandbox Code Playgroud)

重要的功能是: