2008-08-24 22 views
12

Tengo dos matrices de animales (por ejemplo).¿Cómo puedo combinar matrices PHP?

$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 unir las dos matrices en una por ID?

Respuesta

3

Esto hace lo que Erik sugirió (número de identificación como clave de matriz) y combina los elementos en $array2 en $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']; 
    } 
} 
3

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á que foreach través de una matriz, realizando array_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í como que por lo menos. Tal vez hay una mejor solución?

-3
$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; 
} 
1

@Andy

Ya he mirado en ese y no ver cómo puede ayudar a fusionar las matrices multidimensionales. Tal vez podrías dar un ejemplo.

@kevin

Eso es probablemente lo que tendrá que hacer lo que creo que el código de abajo 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 va a ser muy lento, ya que pasa a través del segundo bucle cada vez que:

foreach($array as &$animal) 
{ 
    foreach($array2 as $animal2) 
    { 
     if($animal['id'] === $animal2['id']) 
     { 
      $animal = array_merge($animal, $animal2); 
      break; 
     } 
    } 
} 
3
<?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 — Merge two or more arrays recursively

salidas:

 Array 
(
    [a] => 1 
    [b] => Array 
     (
      [t] => 4 
      [g] => Array 
       (
        [e] => 8 
        [h] => 5 
        [v] => 9 
       ) 

      [0] => 4 
     ) 

    [c] => 3 
) 
1

I preferiría preferir array_splice sobre array_merge debido a su desempeño cuestiones ormance, mi solución sería:

<?php 
array_splice($array1,count($array1),0,$array2); 
?> 
1
foreach ($array as $a) 
    $new_array[$a['id']]['name'] = $a['name']; 

foreach ($array2 as $a) 
    $new_array[$a['id']]['age'] = $a['age']; 

y esto es resultado:

[1] => Array 
     (
      [name] => Cat 
      [age] => 123 
     ) 

    [2] => Array 
     (
      [name] => Mouse 
      [age] => 321 
     ) 
1
<?php 
$array1 = array("color" => "red", 2, 4); 
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); 
$result = array_merge($array1, $array2); 
print_r($result); 
?> 
1

Con PHP 5.3 se puede hacer este tipo de fusión con array_replace_recursive()

http://www.php.net/manual/en/function.array-replace-recursive.php

Eres matriz resultante debe ser similar:

Array (
    [0] => Array 
     (
      [id] => 2 
      [name] => Cat 
      [age] => 321 
     ) 

    [1] => Array 
     (
      [id] => 1 
      [name] => Mouse 
      [age] => 123 
     ) 
) 

¿Qué es lo que creo que quería como resultado.

Cuestiones relacionadas