2010-09-07 21 views

Respuesta

23

Si utiliza las teclas de auto-asignado (por ejemplo literales), array_unshift() lo hará.
Si usa claves autogeneradas (numéricas), ¿cómo debería funcionar? Use '-1' como la nueva primera clave?

EDIT:
Gracias a jasons por señalar un error en esta respuesta.
CUALQUIER tecla numérica se volverá a indexar por array_unshift(), independientemente de si se generó automáticamente o se autoasignó: si es numérica, se codificará. Vea el enlace a la documentación arriba para más detalles.

+0

no porque si los índices representan identificadores en una tabla, nunca habrá un índice cero, así que esto funciona bien para estas situaciones – Nicola

+0

@Nicola Lo siento - I no entiendo lo que intentas decirme. –

+0

Quería decir que si devuelve filas de una base de datos y las claves de la matriz son las identificaciones de fila, entonces una matriz nunca tendrá una clave 0. Por lo tanto, en este caso, no surgiría una situación donde el índice sería -1. – Nicola

7

Use array_unshift(). (Como se mencionó, mantendrá sus claves de cadena intactas, pero no las teclas numéricas).

+1

"Todas las teclas numéricas de la matriz se modificarán para comenzar a contar desde cero, mientras que las claves literales no se tocarán". (http://www.php.net/array-unshift) –

4

intente esto:

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

Utilice array_unshift(); esto ayudará u en adición elemento

+0

'array_unshift()' VOLVERÁ a indexar las teclas numéricas. – Narf

2

Sólo una nota rápida para si desea utilizar esto en un bucle ...

Como se ha dicho aquí: http://jp2.php.net/manual/en/function.array-unshift.php

array_unshift() añade los elementos pasaron a el frente de la matriz. Tenga en cuenta que la lista de elementos se antepone como un todo, de modo que los elementos antepuestos permanecen en el mismo orden. Todas las teclas numéricas de la matriz se modificarán para comenzar a contar desde cero, mientras que las claves literales no se tocarán.

para darle una idea de lo lento que es esto, escribimos un código de referencia (basado en http://pastebin.com/Jad5TjsQ), y aquí está cómo se ve

[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$ 

Tenga en cuenta que todas las pruebas son 10 * 10000 , excepto el array_unshift que corre 1 * 10.000 (estaba bastante cansado de esperar) ... Así que de nuevo, no use array_shift en la iteración, ya que invertir la matriz una sola vez cuesta casi nada en su lugar.

66

Para evitar que las claves numéricas se reindexen, simplemente puede agregar las matrices juntas.

En lugar de:

array_unshift($arr1, $arr2) 

intento:

$arr1 = $arr2 + $arr1; 
+0

Estaba buscando cómo mantener las teclas numéricas y esto funcionó muy bien! – rlorenzo

+1

Siempre he evitado agregar matrices de esta manera, prefiriendo 'array_merge' en su lugar, pero ahora tengo una razón legítima para usarlo. ¡Gracias! – Benjam

+0

El concepto es simple – Yaroslav

0

Bueno, si usted está haciendo lo que estoy haciendo y creando una forma de selección utilizando los resultados de la base de datos con índices siendo los identificadores de la Tabla DB, pero quiere agregar decir "Cualquier ..." a la matriz con un índice de 0, simplemente cree primero la variable de matriz con ese elemento, luego rellene los valores restantes de la base de datos. No es necesario desviar ni pedir cosas después de la llamada a la base de datos.

2

Agregando mi propia respuesta (redundante), porque traté de editar Martin's answer, usando su ejemplo original, pero fue rechazada por otros (no por Martin). Tal vez no revisaron la historia de su respuesta, ya que estoy usando su matriz y problema de ejemplo original. Aquí está mi edición rechazada.

Kevin Wentworth's answer es correcto. Ampliando la respuesta utilizando el ejemplo original del Martin's answer, si tiene una matriz

$a = [1 => a, 2 => b, 5 => e, 6 => f, 8 => h, 9 => i]; 

y desea tomar los tres últimos elementos y anteponer a esta misma matriz, entonces se podría hacer lo siguiente.

$a = array_slice($a, -3, null, true) + $a; 

La matriz resultante es

array (6 => 'f', 8 => 'h', 9 => 'i', 1 => 'a', 2 => 'b', 5 => 'e',) 

Notas

El argumento true a array_slice conserva teclas numéricas (existe tal parámetro para array_unshift).

Aunque array_slice no elimina nada de la matriz original, debido al comportamiento del operador + en las matrices, los tres últimos elementos se cancelan.

De la documentación para el + array operator

El operador + devuelve la matriz de la derecha anexa a la matriz de la izquierda; para las claves que existen en ambas matrices, se usarán los elementos de la matriz de la izquierda y se ignorarán los elementos coincidentes de la matriz de la derecha.

Cuestiones relacionadas