Подтвердить что ты не робот

Добавление элемента в начало массива без изменения других ключей массива

Как я могу добавить элемент в начало массива без изменения значений ключа массива в PHP?

4b9b3361

Ответ 1

Если вы используете самонастраиваемые (например, литералы) ключи, array_unshift() будет делать это.
Если вы используете автоматические (цифровые) клавиши, как это должно работать? Использовать '-1' в качестве нового первого ключа?

EDIT:
Спасибо JasonS за указание на ошибку в этом ответе.
Любой цифровой ключ будет повторно проиндексирован array_unshift(), независимо от того, был ли он автогенерирован или самонастраивается - если он числится, он будет скремблироваться. Подробнее см. Ссылку на приведенную выше документацию.

Ответ 2

Чтобы не менять числовые ключи, вы можете просто добавить массивы вместе.

Вместо:

array_unshift($arr1, $arr2)

попробовать:

$arr1 = $arr2 + $arr1;

Ответ 3

Используйте array_unshift(). (Как уже упоминалось, он сохранит ваши строковые ключи целыми, но не числовыми).

Ответ 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;
    }

Ответ 5

Просто обратите внимание, если вы хотите использовать это в цикле...

Как указано здесь: http://jp2.php.net/manual/en/function.array-unshift.php

array_unshift() добавляет переданные элементы в начало массива. Обратите внимание, что список элементов добавляется в целом, так что добавленные элементы остаются в одном порядке. Все числовые ключи массива будут изменены, чтобы начать отсчет с нуля, пока не будут затронуты литеральные клавиши.

Чтобы дать вам представление о том, как это медленное, мы написали некоторый контрольный код (на основе http://pastebin.com/Jad5TjsQ), и вот как он выглядит

[email protected]:~/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
[email protected]:~/dev/test$

Обратите внимание, что все тесты 10 * 10 000, за исключением array_unshift, который работает 1 * 10 000 (довольно устал ждать)... Так что опять же, не используйте array_shift в итерации, так как реверсирование массива только один раз стоит почти ничего вместо.

Ответ 6

Добавление моего собственного (избыточного) ответа, потому что я попытался отредактировать ответ 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',)

Примечания

Аргумент true для array_slice сохраняет числовые клавиши (такой параметр не существует для array_unshift).

Хотя array_slice не удаляет ничего из исходного массива из-за поведения оператора + на массивах, последние три элемента отменены.

В документах для + оператор массива

Оператор + возвращает правый массив, присоединенный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут игнорироваться.

Ответ 7

array_unshift не будет изменять не числовые клавиши

Ответ 8

Использовать array_unshift(); это поможет вам добавить элемент

Ответ 9

Хорошо, если вы делаете то, что делаете, и создаете форму выбора, используя результаты из базы данных с индексами, являющимися идентификаторами из таблицы БД, но хотите добавить в массив с индексом "Any..." 0, просто сначала создайте переменную массива с этим элементом, а затем заполните оставшиеся значения из базы данных. Не нужно удалять или упорядочивать вещи после вызова базы данных.