如何编写一个当前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
)。
有几点需要注意:
答案 0 :(得分:3)
首先,PHP数组在数据结构意义上不是“数组”;它们实际上是哈希表和双重链表。当您索引到数组时,例如对$list[$i]
$i
进行哈希处理以找到相应的元素;这不是简单的算法,因为它在例如C ++。
此外,由于数组也是链接列表,array_splice
的实现比它看起来更有效,至少如果删除的部分足够小(散列新项目通常很快,并插入项目)在链表的某个地方是恒定的时间。)
当然这意味着PHP数组比“纯”数组消耗更多的内存,如果你想要的只是基于索引的访问,它们也会更慢。在这些情况下,SPL提供SplFixedArray
,它是数据结构意义上的数组的实现。
在您的特定情况下,array_splice
应该是您的第一选择;只需一次调用就可以插入一个数组块:
array_splice($MasterItemList, $cursor, 0, $ItemList);