2015-07-02 23 views
7

Próbowałem połączyć dwie różne tablice w jedną tablicę. Czy ktoś może mi pomóc?PHP scalanie tablic według wartości dla 2 różnych wartości tablicy

mam array jak ten

[0] (Array)#2 
    [rank] "579" 
    [id] "1" 
[1] (Array)#4 
    [rank] "251" 
    [id] "2" 

[0] (Array)#2 
    [size] "S" 
    [rank] "251" 
[1] (Array)#15 
    [size] "L" 
    [rank] "579" 

muszę się ten

[0] (Array)#2 
    [size] "S" 
    [rank] "251" 
    [id] "1" 
[1] (Array)#15 
    [size] "L" 
    [rank] "579" 
    [id] "1" 
+4

[array_merge] (http://php.net/manual/en/function.array-merge.php)? – Andrew

+0

pożądana wydajność nie ma dla mnie większego sensu. – treegarden

+0

Czy próbowałeś czegoś? Jak zdobywasz te tablice? –

Odpowiedz

0

A ja nie rozumiem, dlaczego chcesz scalić tablic w ten sposób, oto sposób scalić tablic przez ich sekwencje. więc pierwszym dzieckiem tablica1 zostaną połączone z pierwszym dzieckiem tablica2 itp

<?php 

$array1 = [ 
    [ 
     'rank' => 579, 
     'id' => 1 
    ], 
    [ 
     'rank' => 251, 
     'id' => 2 
    ] 
]; 

$array2 = [ 
    [ 
     'size' => 'S', 
     'rank' => 251 
    ], 
    [ 
     'size' => 'L', 
     'rank' => 579 
    ] 
]; 


foreach ($array1 as $key => &$data) { 
    if (isset($array2[$key])) { 
     $data = array_merge($data, $array2[$key]);  
    } 
} 

var_dump($array1); 
+0

Co, jeśli sekwencje nie są takie same? –

+0

jeśli większość założonych odpowiedzi jest przypadkiem, a @ użytkownik3686600 chce użyć rangi jako punktu połączenia, to rozwiązanie będzie niepoprawne – Ali

4

Nietestowane, ale to powinno działać, a przynajmniej dostać się blisko.

for ($array1 as $key1 => $value1) { 
    for ($array2 as $key2 => $value2) { 
     if ($value1['rank'] == $value2['rank']) { 
      $result[$key1] = [$value2['size'], $value1['rank'], $value1['id']]; 
     }; 
    }; 
}; 
+0

Spowoduje to zmianę jednej z tablic ($ tablica1). musisz się upewnić, że jest to akceptowane na podstawie twoich kryteriów. zazwyczaj proces scalania powinien pozostawić nienaruszone pierwotne korzenie i utworzyć nowy _ (trzeci) _ obiekt jako wynik – Ali

+1

Naprawiony, my/i możemy sprawić, że on wymyśli klucze potrzebne do skopiowania. Nie widzę powodu, aby dodawać to jeszcze. – psycotik

1
foreach($arr1 as $key1 => $data1){ 
    foreach($arr2 as $key2 => $data2){ 
     if($data1['rank']==$data2['rank']){ 
      $result[] = array_merge($data1, $data2); 
     } 
    } 
} 
print_r($result); 
+0

Właściwe rozwiązanie do scalania, ale zakładasz, że klucz ** ** jest zawsze obecny i unikatowy w obu tablicach (co jest w porządku, o ile to w tym przypadku):) – Ali

+1

jeśli masz jakiś unikalny klucz, którego użyłeś nie musisz sprawdzać, czy condion i seconf for loop. :) –

+0

Uzgodnione, o ile nasze założenie wokół ** rank ** jest ważne;) – Ali

0
//save keys of ranks in the 1st array 
$keys = array(); 
foreach($arr1 as $k => $v) 
    $keys[$v['rank']] = $k; 

$res = array(); 
// Walk through the 2nd array and make result 
foreach($arr2 as $k => $v) 
if (isset($keys[$v['rank']])) 
    $res[] = array_merge($arr1[$keys[$v['rank']]], $v); 

print_r($res); 
0

Patrząc na swoim dostarczonych tablic, jestem przy założeniu chcesz użyć klucza rangę jako punkt łączący (co nie wydaje się taki dobry pomysł, i pytanie będzie, jeśli ich unikatowy lub nie) jeśli są one unikalne wtedy malutka metoda może pomóc, aby pobrać elementu na podstawie ich rangi, a reszta jest tylko montaż rezultat:

<?php 

$arr1 = [ 
    [ 
     'rank' => 579, 
     'id' => 1 
    ], 
    [ 
     'rank' => 251, 
     'id' => 2 
    ], 
]; 

$arr2 = [ 
    [ 
     'size' => 'S', 
     'rank' => 251 
    ], 
    [ 
     'size' => 'L', 
     'rank' => 579 
    ], 
]; 

function getItemByRank($array, $rank) 
{ 
    foreach ($array as $item){ 
     if ($item['rank'] === $rank) { 
      return $item; 
     } 
    } 
} 


$result = []; 
foreach ($arr1 as $k => $item) { 

    $match = getItemByRank($arr2, $item['rank']); 

    if (isset($match)) { 
     $result[$k] = $item; 
     $result[$k]['size'] = $match['size']; 
    } 
} 

print_r($result); 

Wydajność:

Array 
(
    [0] => Array 
     (
      [rank] => 579 
      [id] => 1 
      [size] => L 
     ) 

    [1] => Array 
     (
      [rank] => 251 
      [id] => 2 
      [size] => S 
     ) 

)