Как я могу добавить элемент в начало массива без изменения значений ключа массива в PHP?
Добавление элемента в начало массива без изменения других ключей массива
Ответ 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, просто сначала создайте переменную массива с этим элементом, а затем заполните оставшиеся значения из базы данных. Не нужно удалять или упорядочивать вещи после вызова базы данных.