multidimensional functions elementos ejemplos concatenar combine array agregar php associative-array array-merge

functions - php array_merge arrays asociativos



php array functions (7)

Estoy tratando de anteponer un elemento al comienzo de una matriz asociativa. Pensé que la mejor manera de hacer esto es usar array_merge, pero estoy teniendo algunas consecuencias extrañas. Obtengo el ID y el Nombre de los productos de una base de datos mysql, y se devuelve como una matriz asociativa, como esto (no los datos reales que se devuelven, sino datos de muestra para esta pregunta que representa cómo se ven los datos aproximadamente):

$products = array (1 => ''Product 1'', 42 => ''Product 42'', 100 => ''Product 100'');

esto se envía a un ayudante html para crear un menú desplegable que asocia la clave con el valor, y el valor del elemento de la matriz se establece como el texto en el control de selección desplegable. Necesito que el primer elemento sea algo como "Por favor, seleccione" con una clave de 0, así que hice esto:

$products = array_merge(array(0 => "Select a product" ), $products);

La matriz resultante se ve así:

array( 0 => ''Select a product'', 1 => ''Product 1'', 2 => ''Product 42'', 3 => ''Product 100'' );

cuando Lo que realmente quería era no perder las claves de la matriz asociativa. Me dijeron que puede usar array_merge correctamente con matrices asociativas de la manera que lo intenté; sin embargo, creo que debido a que mis claves son correctas, no está tratando a la matriz como una verdadera matriz asociativa, y las comprime como se ilustra arriba.

La pregunta es: ¿Por qué la función array_merge está cambiando las claves de los elementos? ¿Puedo evitar que haga esto? O, ¿hay otra forma en la que pueda lograr lo que estoy tratando de hacer, agregar el nuevo elemento al comienzo de la matriz?


De la docs :

Los valores en la matriz de entrada con claves numéricas se volverán a numerar con las claves incrementales comenzando desde cero en la matriz de resultados.


De la docs :

Si desea agregar elementos de la matriz de la segunda matriz a la primera matriz sin sobrescribir los elementos de la primera matriz y no volver a indexar, use el operador de la unión de la matriz +

Las claves del primer argumento de matriz se conservan cuando se usa el operador + union, por lo tanto, invertir el orden de sus argumentos y usar el operador union debe hacer lo que necesita:

$products = $products + array(0 => "Select a product");


Podrías probar algo como

$products[0]=''Select a Product'' ksort($products);

Eso debería poner el 0 al inicio de la matriz, pero también ordenará los otros productos en orden numérico, lo que tal vez no desee.


Podrías usar operador de matriz : +

$products = array(0 => "Select a product" ) + $products;

hará una unión y solo funciona cuando las teclas no se superponen.


Sólo por diversión.

$newArray = array_combine(array_merge(array_keys($array1), array_keys($array2) ), array_merge(array_values($array1), array_values($array2) ) );


Tu hombre quiere mirar la función array_replace .

En este ejemplo son la misma función:

$products1 = array (1 => ''Product 1'', 42 => ''Product 42'', 100 => ''Product 100''); $products2 = array (0 => ''Select a product''); $result1 = array_replace($products1, $products2); $result2 = $products1 + $products2; Result for both result1 and result2: Keys are preserved: array(4) { [1] => string(9) "Product 1" [42] => string(10) "Product 42" [100] => string(11) "Product 100" [0] => string(16) "Select a product" }

Sin embargo, difieren si la misma clave está presente en ambas matrices: el operador + no sobrescribe el valor, array_replace lo hace.


array_merge recalculará los índices numéricos. Debido a que su matriz asociativa utiliza índices numéricos, se volverán a numerar. O bien inserta un carácter no numérico delante de los índices como:

$products = array (''_1'' => ''Product 1'', ''_42'' => ''Product 42'', ''_100'' => ''Product 100'');

O puede crear la matriz resultante manualmente:

$newproducts = array (0 => "Select a product"); foreach ($products as $key => $value) $newproducts[$key] = $value;