2008-08-24 33 views
12

Ho due matrici di animali (per esempio).Come posso unire gli array 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, 
    ) 
); 

Come unire i due array in uno dall'ID?

risposta

3

Questo fa ciò che Erik ha suggerito (numero id come chiave di array) e unisce le varianti in $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']; 
    } 
} 
3

Prima di tutto, perché non si utilizza l'ID come indice (o chiave, nell'array di stile di mappatura che gli array di php sono imo)?

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

dopo che dovrete foreach attraverso un array, eseguendo array_merge sulle voci dell'altra:

foreach($array2 as $key=>$value) { 
    if(!is_array($array[$key])) $array[$key] = $value; 
    else $array[$key] = array_merge($array[key], $value); 
} 

Qualcosa del genere, almeno. Forse c'è una soluzione migliore?

-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

Ho già guardato questo e non vedere come può aiutare unire array multidimensionali. Forse potresti dare un esempio.

@kevin

che è probabilmente quello che ho bisogno di fare come penso che il codice qui sotto sarà molto lenta. Il codice effettivo è leggermente diverso perché sto usando ADOdb (e ODBC per l'altra query) ma lo farò funzionare e pubblicherò la mia risposta.

Questo funziona, tuttavia ritengo che sarà molto lento come esso passa attraverso il secondo loop ogni volta:

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

uscite:

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

      [0] => 4 
     ) 

    [c] => 3 
) 
1

I preferirei preferibilmente array_splice su array_merge a causa del suo problemi ormance, la mia soluzione sarebbe:

<?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']; 

e questo è il risultato:

[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 si può fare questo tipo di fusione con array_replace_recursive()

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

Sei serie risultante dovrebbe essere simile:

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

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

Che è quello che penso che si voleva di conseguenza.

Problemi correlati