2010-09-07 20 views
23

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

+0

Как это будет работать? Что делать, если у вас есть элемент с ключом '0'? –

+3

Можете ли вы привести пример с массивом ввода и вывода, который вам нужен? –

ответ

23

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

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

+0

нет, потому что если индексы отображают идентификаторы в таблице, никогда не будет нулевого индекса, поэтому это нормально работает для этих ситуаций – Nicola

+0

@ Никола Извините - я не понимаю, что вы пытаетесь мне сказать. –

+0

Я имел в виду, что если вы возвращаете строки из базы данных, а ключи массива - это идентификаторы строк, тогда массив никогда не будет иметь клавишу 0. Поэтому в этом случае ситуация не возникнет, когда индекс будет равен -1. – Nicola

7

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

+1

«Все ключи числового массива будут изменены, чтобы начать отсчет с нуля, пока буквальные клавиши не будут касаться». (http://www.php.net/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; 
    } 
0

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

+0

'array_unshift()' WILL переопределяет числовые ключи. – Narf

2

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

Как указано здесь: 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 в итерации, так как реверсирование массива только один раз почти ничего не стоит.

66

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

Вместо:

array_unshift($arr1, $arr2) 

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

$arr1 = $arr2 + $arr1; 
+0

Смотрел, как сохранить цифровые клавиши, и это получилось здорово! – rlorenzo

+1

Я всегда избегал добавления массивов таким образом, вместо этого предпочитая 'array_merge', но теперь у меня есть законная причина использовать его. Благодаря! – Benjam

+0

Концепция проста – Yaroslav

0

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

2

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

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