¿Cómo puedo agregar un elemento al comienzo de la matriz sin cambiar los valores de la clave de matriz en PHP?Agregar un elemento al comienzo de una matriz sin cambiar otras teclas de matriz
Respuesta
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.
no porque si los índices representan identificadores en una tabla, nunca habrá un índice cero, así que esto funciona bien para estas situaciones – Nicola
@Nicola Lo siento - I no entiendo lo que intentas decirme. –
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
Use array_unshift()
. (Como se mencionó, mantendrá sus claves de cadena intactas, pero no las teclas numéricas).
"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) –
array_unshift no modificarán las teclas numéricas no
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;
}
Utilice array_unshift(); esto ayudará u en adición elemento
'array_unshift()' VOLVERÁ a indexar las teclas numéricas. – Narf
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.
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;
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.
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.
- 1. javascript presionando elemento al comienzo de una matriz
- 2. PHP agregar un elemento de una matriz
- 3. ¿Devolviendo una matriz sin un elemento eliminado? ¿Usar empalme() sin cambiar la matriz?
- 4. PHP: Mover el elemento asociativo de la matriz al comienzo de la matriz
- 5. PHP cambiar el nombre de las teclas de una matriz
- 6. ¿Cómo muevo un elemento de matriz con una clave conocida al final de una matriz en PHP?
- 7. Obtener el último elemento de una matriz sin cambiar la matriz en PHP?
- 8. ¿Cuál es la manera más fácil de empujar un elemento al comienzo de la matriz?
- 9. Agregar elementos al último elemento de la matriz
- 10. Agregar elementos de una matriz
- 11. matriz unsetting teclas
- 12. cómo cambiar las teclas de matriz de mayúsculas a minúsculas?
- 13. Serialize matriz sin elemento raíz
- 14. Restablecer las teclas de matriz en matriz multidimensional
- 15. teclas matriz dinámica
- 16. Agregar elemento a la matriz en VBScript
- 17. Eliminar elemento de la matriz y reducir la matriz
- 18. ¿Es posible agregar un elemento a una matriz en awk sin especificar un índice?
- 19. ¿Cómo agregar un valor de matriz al centro de una matriz?
- 20. matriz cambiará al siguiente elemento
- 21. ¿Cómo insertar un elemento al comienzo de una ObservableCollection?
- 22. PHP cambiar el nombre de las teclas de matriz en matriz multidimensional
- 23. Eliminar un elemento de una matriz (Java)
- 24. Eliminar un elemento de matriz y cambiar los restantes
- 25. ¿No es una matriz/nombre de matriz siempre un puntero al primer elemento en C?
- 26. PHP - Obtener el índice de un elemento de una matriz
- 27. compruebe si una matriz contiene algún elemento de otra matriz
- 28. Modificar el último elemento de una matriz
- 29. cómo puedo agregar Agregar texto al comienzo de cada línea?
- 30. casting una matriz con teclas numéricas como un objeto
¿Cómo funcionaría? ¿Qué pasa si tienes un artículo con la clave '0'? –
Puede dar un ejemplo con una matriz de qué entrada y salida necesita –