2015-07-02 9 views
7

Ho provato a unire due array diversi in un singolo array. Qualcuno mi può aiutare per favore?Array di merge in base al valore per 2 diversi valori di array

ho gamma come questo

[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" 

ho bisogno come questo

[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

l'output desiderato non ha molto senso per me. – treegarden

+0

Hai provato qualcosa? Come stai ottenendo quegli array? –

risposta

0

Anche se non capisco il motivo per cui si desidera unire le matrici in questo modo, ecco un modo per unire le matrici da le loro sequenze. in modo che il primo figlio di array1 sarà fusa con il primo figlio di array2 ecc

<?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

E se le sequenze non sono le stesse? –

+0

se la maggior parte delle risposte assunte è il caso e @ user3686600 si desidera utilizzare il rango come punto di congiunzione la soluzione sarà errata – Ali

4

testato, ma questo dovrebbe funzionare, o almeno ottenere si chiude.

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

Ciò cambierà uno degli array ($ array1). devi assicurarti che sia accettato in base ai tuoi criteri. di solito un processo di unione dovrebbe lasciare intatte entrambe le radici originali e creare una nuova _ (terza) _ entità come risultato – Ali

+1

Risolto, potremmo fare in modo che capisca le chiavi che ha bisogno di copiare. Non vedo alcun motivo per aggiungerlo ancora. – 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

una soluzione di unione corretta ma si presume che la chiave ** rank ** sia sempre presente e univoca in entrambi gli array (che va bene per quello che è il caso :)) – Ali

+1

se si dispone di una chiave univoca, è stata utilizzata quella in altro modo non è necessario controllare se condion e seconf for loop. :) –

+0

D'accordo, per quanto la nostra ipotesi intorno al ** rank ** sia valida;) – 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

Guardando gli array forniti, sto supponendo che si desidera utilizzare il tasto rango come il punto di unione (che non sembra una buona idea, e domanda sarà se il loro unico o no) se sono unici quindi un metodo molto piccolo può aiutare a prendere elemento in base al loro rango e il resto è solo il montaggio del risultato:

<?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); 

uscita:

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

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

) 
Problemi correlati