0

ソートされたオブジェクトの配列を維持する方法はありますか?

たとえば、プロパティID、Date、Name、およびこれらのオブジェクトのコレクションを持つオブジェクトがある場合、次のようになります。

$col = array();

public function addNewObject($id, $date, $name)
{
    $col[] = new Object($id, $date, $name); 
    //but instead of appending, it should place it by Name desc
}

getObjectsのようなものを呼び出すと、名前descによってコレクション内のアイテムが返されます。

オブジェクトを並べ替えられた順序に戻すにはいくつかの答えがあったと思いますが、効率を上げるには、私の場合の「並べ替え」変数は変更されないため、挿入時に並べ替えた方がよいと思います。

更新: コメントに基づいて、何かが追加されるたびに配列全体を再利用する必要がありますが、それは少しメモリを消費するようです...

配列は最初は常にソートされた順序であるため、配列をトラバースすることで挿入する場所を特定できます(これは効率的でしょうか、より良い方法はありますか?)。配列に新しいオブジェクトを「挿入」するにはどうすればよいでしょうか。

アレイが非常に大きくなるとは思いませんが、これを可能な限り最も効率的な方法で実装したいと思います。

4

2 に答える 2

1

追加した後に配列を再利用することに熱心でない場合 (お勧めしますが、現実的には、これはパフォーマンスの問題にはならず、コードを読みやすくします。

ただし、これを絶対にやりたくない場合は、あなたが言ったように、配列をトラバースして挿入する場所を見つけることができます。

$col = array();

public function addNewObject($id, $date, $name){
    //Find the index to insert at
    $index = 0;
    foreach($col as $i => $item){
        if($item->name > $name){
           //This item is after the item we want to insert. 
           //Use the previous index and stop traversing
           break;
        }
        $index = $i;
    }
    $col = array_splice($col, $index, 0,  new Object($id, $date, $name));
}

https://stackoverflow.com/a/3797526/505722array_spliceのおかげで任意の位置に挿入するために使用

于 2013-02-03T19:38:42.153 に答える
0

これは、ソートしたいキーから配列をソートする関数の良い例です

http://www.php.net/manual/en/function.sort.php#99419

あなたの例では、次のように実行する必要があります:

  array_sort($col, 'Name', SORT_DESC)); 

配列に新しいアイテムを追加するたびに、配列全体が毎回ソートされることに注意してください

于 2013-02-03T19:30:09.750 に答える