2013-02-03 87 views
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,它会按名称返回集合中的项递减。

我认为有一些答案让按照排序顺序返回对象,但为了提高效率,我认为最好在insert中排序,因为在我的情况下,“sort by”变量永远不会改变。

UPDATE: 因此,基于该意见,我应该诉诸整个阵列每次添加的东西,但似乎有点内存密集型...

由于数组将始终处于有序,以首先我可以通过遍历数组来确定我想要插入的位置(这是否有效,有没有更好的方法?)。一旦我发现如何“插入”一个新的对象到数组中?

我不认为这个数组会非常大,但我想实现这个最有效的方式。

+0

你可以克隆一个数组对象来维护它的旧命令并重新排列克隆。 – thegrunt

+1

维护此类订单的一种方法是在添加新项目后再度过整个数组。 –

+0

以@thegrunt的答案为基础,如果您在添加元素之后对数组进行排序,您将在需要时对其进行排序。由于您总是希望它以相同的方式排序,这意味着多次访问数组不会导致多种排序。无论如何,插入正确的位置需要一些“排序”(即确定新元素的位置)。根据你阵列的大小,你可能不值得花费额外的工作。 – Floris

回答

1

如果您不想诉诸于e数组添加后(尽管我会推荐它;实际上这不会是一个性能问题,它保持代码的可读性。

但是,如果你绝对不希望这样做,那么你可以像你说的,遍历数组,并找出插入:

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

使用array_splice的arbritary地位得益于在插入到https://stackoverflow.com/a/3797526/505722

+0

谢谢,因为你提到的排序不会是一个巨大的性能打击如此我会先尝试一下。 – allanx2000

0

这是从任何你想要的关键是通过

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

在你的榜样

分类排序的数组的函数的一个很好的例子,你应该运行它想:

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

起飞请记住,每次向阵列中添加新项目时,整个阵列都会每次排序