2008-08-24 31 views
12

Mam dwie tablice zwierząt (na przykład).Jak mogę łączyć tablice 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, 
    ) 
); 

Jak mogę połączyć dwie tablice w jedną przez identyfikator?

Odpowiedz

3

To robi to, co zasugerował Erik (nr id jako klucz tablicy) i łączy znaki w $array2 z $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

Po pierwsze, dlaczego nie użyjesz ID jako indeksu (lub klucza w tablicy stylów odwzorowujących, że tablice php są imo)?

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

potem musisz foreach za pośrednictwem jednej tablicy, wykonując array_merge na pozycji drugiej:

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

Coś w tym co najmniej. Być może istnieje lepsze rozwiązanie?

-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

Już spojrzał na to i nie zobaczyć, jak może pomóc scalić tablice wielowymiarowe. Może mógłbyś dać przykład.

@kevin

To jest chyba to, co będę musiał zrobić jak myślę poniższy kod będzie bardzo powolny. Rzeczywisty kod jest nieco inny, ponieważ używam ADOdb (i ODBC dla drugiego zapytania), ale sprawię, że zadziała i opublikuje własną odpowiedź.

To działa, jednak myślę, że to będzie bardzo powolne, gdyż przechodzi przez drugą pętlę za każdym razem:

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

Wyjścia:

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

      [0] => 4 
     ) 

    [c] => 3 
) 
1

I wolałby array_splice niż array_merge ze względu na jego perf Kwestie ormance moje rozwiązaniem byłoby:

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

i jest to wynik:

[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

z PHP 5.3 można zrobić tego typu łączą się z array_replace_recursive()

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

Jesteś wypadkowa tablica powinna wyglądać następująco:

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

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

czyli to, co myślę, że chciał w wyniku.