unir - ¿Cómo puedo combinar matrices PHP?
php array merge multidimensional (10)
Tengo dos matrices de animales (por ejemplo).
$array = array(
array(
''id'' => 1,
''name'' => ''Cat'',
),
array(
''id'' => 2,
''name'' => ''Mouse'',
)
);
$array2 = array(
array(
''id'' => 2,
''age'' => 321,
),
array(
''id'' => 1,
''age'' => 123,
)
);
¿Cómo puedo fusionar las dos matrices en una por ID?
<?php
$a = array(''a'' => ''1'', ''b'' => array(''t'' => ''4'', ''g'' => array(''e'' => ''8'')));
$b = array(''c'' => ''3'', ''b'' => array(''0'' => ''4'', ''g'' => array(''h'' => ''5'', ''v'' => ''9'')));
$c = array_merge_recursive($a, $b);
print_r($c);
?>
array_merge_recursive - Fusiona dos o más matrices recursivamente
productos:
Array
(
[a] => 1
[b] => Array
(
[t] => 4
[g] => Array
(
[e] => 8
[h] => 5
[v] => 9
)
[0] => 4
)
[c] => 3
)
@Andy
Esa fue mi primera idea, pero no funciona, sin embargo array_merge_recursive podría funcionar, demasiado flojo como para comprobarlo ahora.
En primer lugar, ¿por qué no usa la ID como índice (o clave, en la matriz de estilo de mapeo que las matrices php son imo)?
$array = array(
1 => array(
''name'' => ''Cat'',
),
2 => array(
''name'' => ''Mouse'',
)
);
después de eso, tendrás que avanzar por una matriz y realizar una matriz_merge en los elementos de la otra:
foreach($array2 as $key=>$value) {
if(!is_array($array[$key])) $array[$key] = $value;
else $array[$key] = array_merge($array[key], $value);
}
Algo así al menos. Tal vez hay una mejor solución?
Esto hace lo que Erik sugirió (número de identificación como clave de matriz) y fusiona los vlaues en $array2
a $results
.
$results = array();
foreach($array as $subarray)
{
$results[$subarray[''id'']] = array(''name'' => $subarray[''name'']);
}
foreach($array2 as $subarray)
{
if(array_key_exists($subarray[''id''], $results))
{
// Loop through $subarray would go here if you have extra
$results[$subarray[''id'']][''age''] = $subarray[''age''];
}
}
foreach ($array as $a)
$new_array[$a[''id'']][''name''] = $a[''name''];
foreach ($array2 as $a)
$new_array[$a[''id'']][''age''] = $a[''age''];
y este es el resultado:
[1] => Array
(
[name] => Cat
[age] => 123
)
[2] => Array
(
[name] => Mouse
[age] => 321
)
<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>
Con PHP 5.3 puedes hacer este tipo de combinación con array_replace_recursive ()
http://www.php.net/manual/en/function.array-replace-recursive.php
Tu matriz resultante debería verse así:
Array (
[0] => Array
(
[id] => 2
[name] => Cat
[age] => 321
)
[1] => Array
(
[id] => 1
[name] => Mouse
[age] => 123
)
)
Que es lo que creo que querías como resultado.
Preferiría array_splice
sobre array_merge
debido a sus problemas de rendimiento, mi solución sería:
<?php
array_splice($array1,count($array1),0,$array2);
?>
$new = array();
foreach ($array as $arr) {
$match = false;
foreach ($array2 as $arr2) {
if ($arr[''id''] == $arr2[''id'']) {
$match = true;
$new[] = array_merge($arr, $arr2);
break;
}
}
if ( !$match ) $new[] = $arr;
}
Ya lo he visto y no vi cómo puede ayudar a fusionar matrices multidimensionales. Tal vez podrías dar un ejemplo.
Eso es probablemente lo que tendré que hacer, ya que creo que el código siguiente será muy lento. El código real es un poco diferente porque estoy usando ADOdb (y ODBC para la otra consulta) pero lo haré funcionar y publicaré mi propia respuesta.
Esto funciona, sin embargo, creo que será muy lento ya que pasa por el segundo ciclo cada vez:
foreach($array as &$animal)
{
foreach($array2 as $animal2)
{
if($animal[''id''] === $animal2[''id''])
{
$animal = array_merge($animal, $animal2);
break;
}
}
}