在不更改其他数组键的情况下将元素添加到数组的开头

时间:2010-09-07 09:08:53

标签: php arrays

如何在不更改PHP中的数组键值的情况下将元素添加到数组的开头?

9 个答案:

答案 0 :(得分:74)

为了防止数字键重新编制索引,您只需将数组添加到一起即可。

而不是:

array_unshift($arr1, $arr2)

尝试:

$arr1 = $arr2 + $arr1;

答案 1 :(得分:24)

如果您使用自我分配(例如文字)键,array_unshift()会执行此操作 如果您使用自动生成(数字)键,该怎么办?使用'-1'作为新的第一个键?

修改
感谢JasonS在这个答案中指出错误 任何数字键都将被array_unshift()重新编入索引,无论它是自动生成还是自我分配 - 如果是数字,它都会被扰乱。有关详细信息,请参阅上面文档的链接。

答案 2 :(得分:7)

使用array_unshift()(如上所述,它会保持您的字符串键完好无损,但不会保留数字键。)

答案 3 :(得分:4)

试试这个:

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;
    }

答案 4 :(得分:2)

如果你想在循环中使用它,请快速说明......

如上所述: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$

请注意,所有测试都是10 * 10,000,除了运行1 * 10,000的array_unshift(已经厌倦了等待)...所以再次,不要在迭代中使用array_shift,因为只需一次反转数组没有别的。

答案 5 :(得分:2)

添加我自己的(多余的)答案,因为我尝试使用他的原始示例编辑Martin's answer,但是其他人(不是Martin)拒绝了。也许他们没有回顾他的答案的历史,因为我正在使用他原来的示例阵列和问题。这是我被拒绝的编辑。

Kevin Wentworth's answer是正确的。 如果您有一个数组

,请使用Martin's answer中的原始示例扩展该答案
$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',)

备注

true的{​​{1}}参数保留了数字键(array_slice不存在此参数)。

虽然array_unshift不会删除原始数组中的任何内容,但由于数组上array_slice运算符的行为,最后三项将被取消。

来自+ array operator

的文档
  

+运算符返回附加到左侧数组的右侧数组;对于存在于两个数组中的键,将使用左侧数组中的元素,并且将忽略右侧数组中的匹配元素。

答案 6 :(得分:0)

array_unshift 不会修改非数字键

答案 7 :(得分:0)

使用array_unshift();这将有助于你添加元素

答案 8 :(得分:0)

好吧,如果你正在做我正在做的事情并使用数据库中的结果创建一个选择表单,索引是来自数据库表的ID,但是想要将“Any ...”添加到带有索引的数组中0,只需先用该项创建数组变量,然后填充数据库中的剩余值。数据库调用后无需卸载或订购。