0

有没有办法维护一个排序的对象数组?

例如,如果我有一个具有属性 ID、日期、名称和这些对象的集合的对象:

$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/505722 array_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 回答