如何在 PHP 中将一个元素添加到数组的开头而不改变数组键值?
不要这样写:
array_unshift($arr1, $arr2)
尝试:
$arr1 = $arr2 + $arr1;
array_merge
,但现在我有一个正当的理由来使用它。谢谢! - Benjamarray_unshift()
重新索引,如果是数字的话,它将被打乱。有关详细信息,请参见上面的文档链接。$a
中取出三个项目,并将它们移到数组的前面(使用你的原始示例),你可以这样做:$a = array_slice($a, -3, null, true) + $a;
- Jason Sarray_unshift()
函数。(如上所述,它会保留字符串键,但不保留数值键。)试试这个:
function array_insert(&$array, $insert, $position = -1) {
$position = ($position == -1) ? (count($array)) : $position ;
if($position != (count($array))) {
$ta = $array;
for($i = $position; $i < (count($array)); $i++) {
if(!isset($array[$i])) {
die(print_r($array, 1)."\r\nInvalid array: All keys must be numerical and in sequence.");
}
$tmp[$i+1] = $array[$i];
unset($ta[$i]);
}
$ta[$position] = $insert;
$array = $ta + $tmp;
//print_r($array);
} else {
$array[$position] = $insert;
}
//ksort($array);
return true;
}
我添加了自己(冗余的)答案,因为我试图编辑Martin的答案,使用他的原始示例,但被其他人(不是Martin)拒绝了。也许他们没有审查他的答案历史,因为我正在使用他的原始示例数组和问题。这是我的被拒绝的编辑。
Kevin Wentworth的答案是正确的。扩展该答案,使用Martin的答案中的原始示例,如果您有一个数组
$a = [1 => a, 2 => b, 5 => e, 6 => f, 8 => h, 9 => i];
如果你想将最后三个项目添加到同一数组的开头,那么可以执行以下操作。
$a = array_slice($a, -3, null, true) + $a;
array (6 => 'f', 8 => 'h', 9 => 'i', 1 => 'a', 2 => 'b', 5 => 'e',)
注意事项
array_slice
函数的true
参数会保留数字键(array_unshift
没有此参数)。
尽管array_slice
不会从原始数组中删除任何内容,但由于数组上的+
运算符的行为,最后三个项目被取消了。
来自+数组运算符文档:
+运算符返回右侧附加到左侧的数组;对于两个数组中都存在的键,将使用左侧数组中的元素,并忽略右侧数组中的匹配元素。
如果您想在循环中使用此函数,请注意以下事项:
如http://jp2.php.net/manual/en/function.array-unshift.php所述:
array_unshift()将所传递的元素前置到数组的前面。请注意,元素列表会作为一个整体前置,因此前置的元素顺序不会改变。所有数字数组键都将从零开始计数,而文字键则不会被修改。
为了让您了解其速度慢的情况,我们编写了一些基于http://pastebin.com/Jad5TjsQ的基准测试代码,并且下面是结果:
mt@wizcorp-dev2:~/dev/test$ for d in arrayFillBrackets.php arrayFillPush.php arrayFillUnshift.php arrayFillPushReverse.php ; do cat $d; php $d; done
<?php
require "benchmark.php";
function ArrayFillBrackets()
{
$result = array();
for($i = 0; $i < 10000; $i++) $result[] = $i;
return $result;
}
$result = array();
$result[10]['ArrayFillBrackets'] = Benchmark('ArrayFillBrackets', null, 10);
!!! Benchmarking function ArrayFillBrackets for 10 iteration (args:null)...
===================
Results:
===================
time total: 0.02686286
time min: 0.00198293
time max: 0.0058589
time avg: 0.002686286
memory total: 0
memory min: 0
memory max: 0
memory avg: 0
<?php
require "benchmark.php";
function ArrayFillPush()
{
$result = array();
for($i = 0; $i < 10000; $i++) array_push($result, $i);
return $result;
}
$result = array();
$result[10]['ArrayFillPush'] = Benchmark('ArrayFillPush', null, 10);
!!! Benchmarking function ArrayFillPush for 10 iteration (args:null)...
===================
Results:
===================
time total: 0.03958679
time min: 0.003757
time max: 0.00485086
time avg: 0.003958679
memory total: 0
memory min: 0
memory max: 0
memory avg: 0
<?php
require "benchmark.php";
function ArrayFillUnshift()
{
$result = array();
for($i = 0; $i < 10000; $i++) array_unshift($result, $i);
return $result;
}
$result = array();
$result[1]['ArrayFillUnshift'] = Benchmark('ArrayFillUnshift', null, 1);
!!! Benchmarking function ArrayFillUnshift for 1 iteration (args:null)...
===================
Results:
===================
time total: 3.62487912
time min: 3.62487912
time max: 3.62487912
time avg: 3.62487912
memory total: 0
memory min: 0
memory max: 0
memory avg: 0
<?php
require "benchmark.php";
function ArrayFillPushReverse()
{
$result = array();
for($i = 0; $i < 10000; $i++) array_push($result, $i);
return array_reverse($result);
}
$result = array();
$result[10]['ArrayFillPushReverse'] = Benchmark('ArrayFillPushReverse', null, 10);
!!! Benchmarking function ArrayFillPushReverse for 10 iteration (args:null)...
===================
Results:
===================
time total: 0.05071593
time min: 0.00475311
time max: 0.00560999
time avg: 0.005071593
memory total: 108
memory min: 0
memory max: 24
memory avg: 10.8
mt@wizcorp-dev2:~/dev/test$
array_unshift()
会重新索引数字键。 - Narf嗯,如果你正在做我所做的事情,并且使用从数据库中索引为 DB 表 ids 的结果创建选择表单,但是想要在数组中添加一个索引为 0 的 "任何...",只需首先创建包含该项的数组变量,然后从数据库中填充剩余的值即可。无需在数据库调用后进行 unshift 或排序。
0
的项目呢? - Dominic Rodger