2012-12-02 22 views
9

Powiedzmy mam następujące tablice:Scalanie dwóch wielowymiarowych tablic na konkretnym kluczem

Array 
    (
     [0] => Array 
      (
       [id] => 5 
       [name] => Education 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Computers 
      ) 

     [3] => Array 
      (
       [id] => 7 
       [name] => Science 

     [4] => Array 
      (
       [id] => 1 
       [name] => Sports 
      ) 
    ) 

a drugi:

Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [title] => Sport 
      ) 

     [1] => Array 
      (
       [id] => 7 
       [title] => Sci 
      ) 

     [3] => Array 
      (
       [id] => 4 
       [title] => Comp 

     [4] => Array 
      (
       [id] => 5 
       [title] => Edu 
      ) 
    ) 

i pożądane wyjście jest:

Array 
    (
     [0] => Array 
      (
       [id] => 5 
       [name] => Education 
       [title] => Edu 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Computers 
       [title] => Comp 
      ) 

     [3] => Array 
      (
       [id] => 7 
       [name] => Science 
       [title] => Sci 

     [4] => Array 
      (
       [id] => 1 
       [name] => Sports 
       [title] => Sport 
      ) 
    ) 

mam udało się połączyć te tablice z prostą:

foreach($first as $key => $value){ 
    $result[$key] = array_merge($first[$key], $second[$key]); 
} 

ale wyjście nie łączy się prawidłowo:

Array 
    (
     [0] => Array 
      (
       [id] => 5 
       [name] => Education 
       [title] => Sport 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Computers 
       [title] => Sci 
      ) 

     [3] => Array 
      (
       [id] => 7 
       [name] => Science 
       [title] => Comp 

     [4] => Array 
      (
       [id] => 1 
       [name] => Sports 
       [title] => Edu 
      ) 
    ) 

Problemem jest to, chciałbym połączyć te tablice na tym samym id. Żądane sortowanie wyników powinno być takie samo jak w pierwszej macierzy.

Jak mogę to osiągnąć? Każda pomoc jest doceniana.

Odpowiedz

8

Można po prostu zrobić zagnieżdżonych pętli i sprawdź, czy wartości id są zgodne, a następnie dodaj title do $first (lub name do)

foreach($first as $key => $value){ 
    foreach($second as $value2){ 
     if($value['id'] === $value2['id']){ 
      $first[$key]['title'] = $value2['title']; 
     }    
    } 
} 
+0

Jaka jest złożoność czasu? O (n^2)? Z pewnością można to zrobić lepiej. – velop

2

Twój kod działa poprawnie. Twoje oczekiwania są po prostu niepoprawne. Na przykład w jednej tablicy czwarty element id zawiera 1, ale w innej macierzy, czwarty element id to 5, więc twoje "scalą te tablice na tym samym id" nie ma sensu, ponieważ poprzez połączenie czwartych elementów w jedno również łączymy ich dzieci, i od id jest używany w obu tablicach, po wartości HAVE TO gone, ponieważ nie może być dwóch równych kluczy w tablicy.

EDIT

trzeba połączyć ręcznie funkcje PHP seryjnej na podstawie kluczy natomiast chcesz połączyć na podstawie zawartości:

$result = array(); 
foreach($arrayA as $keyA => $valA) { 
    foreach($arrayB as $keyB => $valB) { 
    if($valA['id'] == $valB['id']) { 
     $result[$keyA] = $valA + $valB; 

     // or if you do not care output keys, just 
     // $result[] = $valA + $valB; 
    } 
    } 
} 
+0

mam poprawione niektóre błędy w wyjściach, przepraszam za to. To, czego chcę, to wziąć np. '$ First [0] ['id']' (równa się 5 ') znaleźć ten sam "identyfikator" w drugiej tablicy, tutaj '$ sekund [4] [' id ']' i scalić je do nowej tablicy, tak jak to: 'array ('id' => 5, 'name' => 'Education', 'title' => 'Edu')'. Czy to nie możliwe? – user1292810

+0

patrz poprawiona odpowiedź –

+0

Działa jak wdzięk, dzięki :) I przepraszam za zwodniczy tytuł. – user1292810

1

Dopóki obie tablice mają zawsze w sobie wszystkie identyfikatory, a co z sortowaniem dwóch tablic przez pole 'id', a następnie zezwoleniem php na scalenie?

function cmp($a, $b) { 
    return ((int) $a['id'] < (int) $b['id']) ? -1 : 1; 
} 

usort($array1, 'cmp'); 
usort($array2, 'cmp'); 

$result = array_merge($array1, $array2); 

Nie testowałem kodu, ale pokazuje on ideę.

1

Nie używaj foreach w foreach, który może być zbyt wolny, gdy macierz jest tak duża.

$idArray = array_column($secondArray,'title','id'); 
foreach($firstArray as $key => $val){ 
    $firstArray[$key]['title'] = (isset($idArray[$val['id']]) ? $idArray[$val['title'] : 'some title'; 
} 
0

Upewnij się, że rzeczy są w takiej samej kolejności, następnie:

$items = array_map(function($itemFirstArray, $itemSecondArray) { 
    return array_merge($itemFirstArray, $itemSecondArray); 
}, $firstArray, $secondArray);