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 = 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;
        }
    }
}
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;});

上記のコードは、PHP5.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ソート関数の比較は次のとおりです。あなたの場合、あなたはあなた自身のコンパレータを備えた何かを必要とします-これらの1つは「ユーザー定義」としてマークされた「ソートの順序」を持っています、おそらくuasort()またはusort()

編集

カスタムコンパレータは、-1または0または+1のいずれかを返す必要があります。しかし、2つのオブジェクトが互いに等しいか、それよりも小さいか、または大きいことが実際に何を意味するのか、および判断に使用される論理規則を決定するのは、コンパレーター次第です。したがって、ロジックをプログラムする必要があります。つまり、ロジックのルールによってオブジェクトAがBよりも大きい場合は+1を返します。数学的な意味でAが大きいという意味ではありません。アップルとバイクを比較し、コンパレータが+1を返す場合、アップルはバイクよりも大きいことを意味します。そういっただろう。私の論理。限目。

したがって、基本的に、ロジックをアルゴリズムに変換できる場合は、そのロジック/アルゴリズムによってガイドされるコードを記述して、必要な順序を提供するためのコンパレータとして機能させることができます。

于 2012-12-03T22:17:17.717 に答える