2

私はusortを見ましたが、まだ少し混乱しています...

$myobject オブジェクトは次のようになります。

Array
(
    [0] => stdClass Object
        (
            [tid] => 13
            [vid] => 4
        )

    [1] => stdClass Object
        (
            [tid] => 10
            [vid] => 4
        )

    [2] => stdClass Object
        (
            [tid] => 34
            [vid] => 4
        )

    [3] => stdClass Object
        (
            [tid] => 9
            [vid] => 4
        )

これを見た:

function cmp( $a, $b )
{ 
  if(  $a->weight ==  $b->weight ){ return 0 ; } 
  return ($a->weight < $b->weight) ? -1 : 1;
} 
usort($myobject,'cmp');

tid に従って並べ替えようとしていますが、重みを何かに変更する必要があるかどうかは本当にわかりませんか? それともそのまま動作しますか?試してみましたが、何も出力されませんでした...

4

3 に答える 3

6

cmpは、usortが複雑なオブジェクト(あなたのような)を比較してそれらをソートする方法を理解するために使用するコールバック関数です。使用するためにcmpを変更します(または任意の名前に変更します)

function cmp( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'cmp');

function sort_by_tid( $a, $b )
{ 
  if(  $a->tid ==  $b->tid ){ return 0 ; } 
  return ($a->tid < $b->tid) ? -1 : 1;
} 
usort($myobject,'sort_by_tid');

http://www.php.net/usort

于 2010-02-18T05:57:10.273 に答える
0

私は3時間比較関数を書こうとしています。実際には非常に簡単ですが、何かが足りないと思って、サンプル配列でテストする多くの方法でアルゴリズムを変更してゼロから何度も書き直しました。

最後に、問題は内部の uasort 関数にあることに気付きました。すべての項目を比較しきれていません。私は現在使用されているアルゴリズムの名前を覚えていませんが、私自身は C++ で改善されたバージョン (ow mine) を使用しています。このアルゴリズムは、毎回新しいインデックス (下限、上限) を使用して並べ替え関数を再帰的に呼び出し、配列を必要な数のペアに分割することにより、バイナリ ツリーのような比較方法を使用します。

残りのスライスが 1 つの項目の場合、上位と下位のインデックスは同じであり、最後の項目が評価されていないにもかかわらず、関数は終了した (すべての項目を処理した) と見なします。最も内側のブロックの数が奇数の場合、そのアルゴリズムを使用した並べ替え関数は失敗します。2、4、8 ....要素では問題なく動作しますが、3、5、7などでは機能しません...正確な失敗の状態は、要素の並べ替え順序によって異なります。数値は常に意味があるとは限りません。

私は何年も前にその問題を解決しました。私はPHPコンパイラを持っておらず、PHPソースコードも持っていないため、PHPで自分で解決することはできません。しかし、PHP 開発チームの誰かが私に連絡してくれれば、C++ でそのアルゴリズムの作業コピーを提供できます。同じアルゴリズムが、ソートされた要素にアクセスする最速の方法です。

于 2013-02-16T01:05:06.877 に答える