array_shift函数的替代品

时间:2010-04-29 06:34:34

标签: php arrays split

好的,我需要在这个数组中保存键,我只想从这个数组中移出第一个元素。实际上我知道当我这样做时,这个数组的第一个键总是1:

// Sort it by 1st group and 1st layout.
ksort($disabled_sections);
    foreach($disabled_sections as &$grouplayout)
        ksort($grouplayout);

基本上我宁愿不必为了获取密钥= 1的数组来获取它。老实说,我不是array_shift的忠实粉丝,它只需要很长的IMO。还有另一种方式吗?也许是一种提取整个数组的方法,其中找到$ disabled_sections [1]而无需进行foreach并对其进行排序,以及array_shift。我只想将$ disabled [1]添加到不同的数组中,并将其从此数组中删除。同时保持两个数组键的结构都是这样的。从技术上讲,这样做甚至可以:

$array = array();
$array = $disabled_sections[1];

但它需要从$ disabled_sections中删除它。我可以使用这种方法......

$array = array();
$array = $disabled_sections[1];
$disabled_sections -= $disabled_sections[1];

上面的内容是否可能?

感谢。

2 个答案:

答案 0 :(得分:4)

尽管有一个公认的答案;万一其他人偶然发现这种情况,在不使用array_shift的情况下取消设置数组的第一个元素(,无论其键,或其键的顺序)的方法是:

reset($array); // sets internal array pointer to start
unset($array[key($array)]); // key() returns key of current array element

虽然我相当确信array_shift在内部做了什么(所以我想这里没有性能提升),除了检索到的额外回报:

$element = reset($array); // also returns element
unset($array[key($array)]);
return $element;

只是为了完成而已。

答案 1 :(得分:2)

虽然这种方式没有-=运算符,但您可以使用unset从数组中删除该元素:

unset(disabled_sections[1]);

但那只是实施你自己的班次版本。我确实想知道你在什么情况下发现array_shift()'慢'以及你是如何测试这种缓慢的。

默认情况下,数字数组按数字排序 - 不需要ksort。也许你应该尝试像

这样的东西
while($array = array_shift($group_of_arrays)) {

  // ... do stuff
}

如果您不关心从数组中提取元素的顺序,可以使用“array_pop”而不是“array_shift”。由于“array_pop”将元素从数组的末尾移除,因此不需要重新索引,性能也会显着提高。在使用大约80,000个条目的数组进行测试时,我发现使用“array_pop”处理时间减少了90%。