Php 对象的排序数组
有没有办法维护对象的排序数组 例如,如果我有一个具有属性ID、日期、名称和这些对象集合的对象:Php 对象的排序数组,php,arrays,sorting,Php,Arrays,Sorting,有没有办法维护对象的排序数组 例如,如果我有一个具有属性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之类的函数,它将按
$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返回集合中的项
我认为有一些方法可以让对象按排序的顺序返回,但是为了提高效率,我认为最好在insert处排序,因为在我的例子中,“sort by”变量永远不会改变
更新:
因此,根据评论,我应该在每次添加内容时使用整个数组,但这似乎有点占用内存
因为数组总是按顺序排序的,所以我可以通过遍历数组来确定要插入的位置(这是否有效,是否有更好的方法?)。一旦我发现,我如何才能“插入”一个新的对象到数组中
我不认为数组会很大,但我希望以最有效的方式实现它。这是一个很好的函数示例,它可以根据您希望排序的任何键对数组进行排序 在您的示例中,您应该像这样运行它:
array_sort($col, 'Name', SORT_DESC));
请记住,每次向数组中添加新项时,如果您不想在添加后重新使用数组,则每次都会对整个数组进行排序(尽管我建议您这样做;实际上,这不会造成性能问题,并且可以保持代码的可读性) 但是,如果您确实不想这样做,那么您可以,如您所说,遍历数组并找出插入的位置:
$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\u splice
在任意位置插入,由于,您可以克隆数组对象以保持其旧顺序并重新排列克隆对象。保持这种顺序的一种方法是在添加新项后使用整个数组。基于@thegrunt的答案,如果您在添加元素后对数组进行排序,您将对其进行排序当您需要时。由于您总是希望以相同的方式对其排序,这意味着对数组的多次访问不会导致多次排序。插入到正确的位置将需要一点“排序”(即计算新元素的位置)无论如何。可能不值得你做额外的工作-这取决于你数组的大小。另外,不同的是,你用来查找位置和插入新项的额外代码将使用PHP,而排序API使用C。谢谢,正如你提到的,排序不会对性能造成巨大影响,所以我将首先尝试。