Pregunta

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

¿Fue útil?

Solución

Esto hace lo que Erik sugirió (número de identificación como clave de matriz) y combina valores en $ array2 a $ resultados .

$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'];
    }
}

Otros consejos

@Andy

  

http://se.php.net/array_merge

Ese fue mi primer pensamiento, pero no funciona del todo, pero array_merge_recursive podría funcionar, demasiado flojo para comprobarlo ahora mismo.

Primero que nada, ¿por qué no usas la ID como índice (o clave, en la matriz de estilo de mapeo que las matrices de PHP son imo)?

$array = array(
    1 => array(
        'name' => 'Cat',
    ),
    2 => array(
        'name' => 'Mouse',
    )
);

después de eso, tendrás que buscar a 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í al menos. Tal vez hay una mejor solución?

<?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 & # 8212; Combinar dos o más matrices de forma recursiva

salidas:

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

            [0] => 4
        )

    [c] => 3
)

@Andy

Ya lo he visto y no vi cómo puede ayudar a fusionar matrices multidimensionales. Tal vez podrías dar un ejemplo.

@kevin

Probablemente sea eso lo que tendré que hacer ya que creo que el código a continuación 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;
        }
    }
}
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 puede hacer este tipo de fusión con array_replace_recursive ()

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

La matriz resultante debe tener el siguiente aspecto:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top