Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对象的排序数组_Php_Arrays_Sorting - Fatal编程技术网

Php 对象的排序数组

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之类的函数,它将按

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

例如,如果我有一个具有属性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返回集合中的项

我认为有一些方法可以让对象按排序的顺序返回,但是为了提高效率,我认为最好在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。谢谢,正如你提到的,排序不会对性能造成巨大影响,所以我将首先尝试。