Как добавить элемент в начало массива без изменения значений ключа массива в PHP?Добавление элемента в начало массива без изменения других ключей массива
ответ
Если вы используете ключи самоназначенный (например буквенные), array_unshift() будет делать это.
Если вы используете автоматические (цифровые) клавиши, как это должно работать? Использовать '-1' в качестве нового первого ключа?
EDIT:
Спасибо Jasons за указание на ошибку в этом ответе.
ЛЮБОЙ цифровой ключ будет переиндексирован array_unshift()
, независимо от того, было ли оно автогенерировано или самонастраивается - если оно числовое, оно будет скремблировано. Подробнее см. Ссылку на приведенную выше документацию.
нет, потому что если индексы отображают идентификаторы в таблице, никогда не будет нулевого индекса, поэтому это нормально работает для этих ситуаций – Nicola
@ Никола Извините - я не понимаю, что вы пытаетесь мне сказать. –
Я имел в виду, что если вы возвращаете строки из базы данных, а ключи массива - это идентификаторы строк, тогда массив никогда не будет иметь клавишу 0. Поэтому в этом случае ситуация не возникнет, когда индекс будет равен -1. – Nicola
Использование array_unshift()
. (Как уже упоминалось, он сохранит ваши строковые ключи целыми, но не числовыми).
«Все ключи числового массива будут изменены, чтобы начать отсчет с нуля, пока буквальные клавиши не будут касаться». (http://www.php.net/array-unshift) –
array_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;
}
Использование array_unshift(); это поможет U в добавлении элемента
'array_unshift()' WILL переопределяет числовые ключи. – Narf
Только быстрое примечание, если вы хотите использовать это в цикле ...
Как указано здесь: 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 * 10000 , за исключением array_unshift, который работает 1 * 10 000 (довольно устал ждать) ... Так что опять же, не используйте array_shift в итерации, так как реверсирование массива только один раз почти ничего не стоит.
Чтобы сохранить числовые ключи от переиндексации, вы можете просто добавить массивы вместе.
Вместо:
array_unshift($arr1, $arr2)
попробовать:
$arr1 = $arr2 + $arr1;
Ну, если вы делаете то, что я делаю, и создание избранную форму, используя результаты из БД с индексирует быть идентификаторы из DB, но вы хотите добавить в массив с индексом «Any ...», указав индекс 0, просто сначала создайте переменную массива с этим элементом, а затем заполните оставшиеся значения из базы данных. Не нужно удалять или упорядочивать вещи после вызова базы данных.
Добавление моего собственного (избыточного) ответа, потому что я попытался отредактировать Martin's answer, используя его оригинальный пример, но он был отклонен другими (а не Мартином). Возможно, они не просмотрели историю своего ответа, поскольку я использую его оригинальный массив примеров и проблему. Вот мое отклоненное редактирование.
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
аргумент array_slice
сохраняет цифровые клавиши (не такой параметр не существует для array_unshift
).
Хотя array_slice
не удаляет что-либо из исходного массива, из-за поведения оператора +
на массивах последние три элемента аннулируются.
Из документов для + array operator
Оператор + возвращает массив правой руки, присоединенный к матрице слева; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут проигнорированы.
Как это будет работать? Что делать, если у вас есть элемент с ключом '0'? –
Можете ли вы привести пример с массивом ввода и вывода, который вам нужен? –