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

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

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

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

РЕДАКТИРОВАТЬ:
Спасибо JasonS за указание на ошибку в этом ответе.
Любой цифровой ключ будет повторно проиндексирован с помощью array_unshift() , независимо от того, был ли он автогенерирован или самонастроен – если он является числовым, он будет скремблироваться. Подробнее см. Ссылку на приведенную выше документацию.

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

Вместо:

 array_unshift($arr1, $arr2) 

пытаться:

 $arr1 = $arr2 + $arr1; 

Используйте 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; } с 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; } 

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

Как указано здесь: 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, за исключением array_unshift, который работает 1 * 10 000 (был очень устал ждать) … Так что опять же, не используйте array_shift в итерации, поскольку реверсирование массива только один раз почти ничего не стоит.

Добавление моего собственного (избыточного) ответа, потому что я попытался отредактировать ответ Мартина , используя его оригинальный пример, но он был отклонен другими (а не Мартином). Возможно, они не просмотрели историю своего ответа, поскольку я использую его оригинальный массив примеров и проблему. Вот мое отклоненное редактирование.

Ответ Кевина Вентворта верен. Расширяя этот ответ, используя оригинальный пример из ответа Мартина , если у вас есть массив

 $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

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

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

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

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