如何在PHP中的任意索引中最好地将元素添加到数组?

时间:2013-04-04 08:41:30

标签: php arrays performance interpreter

如何编写一个当前PHP解释器(5.4)足够智能的解决方案,只需执行3-5个副本而不是完整的逐个项目排序?

注意,我知道一些将元素插入索引数组的方法。然而,这不符合我的理解。例如,在 C++ 中,您可以使用std :: copy执行某些操作,或者将struct或union作为多元素数组游标。

所以我想知道我是否会以某种方式使用PHP的规则,可以使用什么语法,更接近

  

范围元素从某些索引复制到结束]到temp C

     

将B复制到A [索引],

     

将C复制到A [索引+计数(B)]

比这个......

$MasterItemList = $Page[$CurrentPage]->GetItems();   /* Returns an array with 512 Items.         */
$UpdateList = GetUpdatePage();                       /* Returns multi-dimensional array such that: 
                                                        $result[][0]=an index and 
                                                        $result[][1]=a list of items             */

foreach($UpdateList as $Update)
{ foreach($Update as $cursor => $ItemList)
  {
    $cursor=$cursor+0;  //to int..
    $numitems=count($ItemList);

    if($ItemList[0]->NewAddition)
    {
      $BeforeUpdate=array_splice($MasterItemList,0, $cursor, true);
      $AfterUpdate=array_splice($MasterItemList, $cursor+$numitems, 0);
      $MasterItemList=array_merge($BeforeUpdate,$ItemList,$AfterUpdate);

      $Page[$CurrentPage]->OffsetCorrection+=$numitems;
    }
    else
    {
      $i=0;
      foreach($ItemList as $LineItem)
      {
        $MasterItemList[$cursor+$i] = $LineItem;
        $i++;
      }
    }
  }
}

请原谅我,如果我有一些错误记下来,请告诉我,我会纠正他们。

但是,我不认为解释器可以使用正确的引用和范围,因为它能够使用此方法直接执行逻辑。它已经是一个看起来很昂贵的东西了......对于PHP来说,这样做“正确的方法”可以做些什么?

  

示例:

// An Update List

Array(
    [0] => Array(
        [0] => 31
        [1] => Array(
            [1] => stdClass Object 
                (
                    [NewAddition] => false
                    [Name] => "********"
                    [Date] => 1364920943
                    [Active] => 1
                    .
                    .
                    .
                )

            [2] => stdClass Object 
                (
                    [NewAddition] => false
                    [Name] => "********"
                    [Date] => 1364920943
                    [Active] => 1
                    .
                    .
                    .
                )

            [3] => stdClass Object 
                (
                    [NewAddition] => false
                    [Name] => "********"
                    [Date] => 1364920943
                    [Active] => 1
                    .
                    .
                    .
                )

        )                
    )
)

MasterItemList只是这些相同对象的数组(class Item)。

有几点需要注意:

  • 只有在对此脚本有用的任何地方,才能以纯顺序方式访问此数据。
  • 在脚本的这一部分中,只需要检查新插入的集合中的第一项是否有更新。集合中的所有项目将始终是新的。
  • 超过512的项目会自动调整为下一页加载。我可以调整页面大小来在数组排序性能和数据之间进行交换。数据获取性能(异步缓冲)。

1 个答案:

答案 0 :(得分:3)

首先,PHP数组在数据结构意义上不是“数组”;它们实际上是哈希表和双重链表。当您索引到数组时,例如对$list[$i] $i进行哈希处理以找到相应的元素;这不是简单的算法,因为它在例如C ++。

此外,由于数组也是链接列表,array_splice的实现比它看起来更有效,至少如果删除的部分足够小(散列新项目通常很快,并插入项目)在链表的某个地方是恒定的时间。)

当然这意味着PHP数组比“纯”数组消耗更多的内存,如果你想要的只是基于索引的访问,它们也会更慢。在这些情况下,SPL提供SplFixedArray,它是数据结构意义上的数组的实现。

在您的特定情况下,array_splice应该是您的第一选择;只需一次调用就可以插入一个数组块:

array_splice($MasterItemList, $cursor, 0, $ItemList);