2015-05-11 2 views
0

Мне нужно объединить два массива с помощью ключевого поля.объединить два массива с использованием общего поля в php

$array1 = array(val1 => 'abc', val2 => '5'); 
$array1 = array(val1 => 'bcd', val2 => '2'); 

$array2 = array(val1 => 'abc', val3 => '1'); 
$array2 = array(val1 => 'zzz', val3 => '3'); 


array1: 
val1 val2 
abc  5 
bcd  2 

array2: 
val1 val3 
abc  1 
zzz  3 

Результат должен быть следующим; (требование)

val1   val2    val3 
abc    5    1 
bcd    2    0 
zzz    0    3 

еще сейчас, я разработал, который дополнительно нуждается в некоторой модификации для достижения указанной выше таблице.

foreach($array1 as $ar1){ 
    $val1=''; 
    $val2=''; 
    $val3=''; 
    foreach($array2 as $ar2){ 
     if($ar1['val1']==$ar2['val1']){ 
      $val1=$ar1['val1']; 
      $val2=$ar1['val2']; 
      $val3=$ar2['val3']; 
     } 
    } 

    $result=array(
     val1 => $val1, 
     val2 => $val2, 
     val3 => $val3 
    ); 

} 

Это фиксирует только общие данные.

+2

В 4 Массивах выше (два повторно объявлено) содержит синтаксическую ошибку, которая представляет собой дополнительная запятая перед последней скобкой. Кроме того, при выражении условий замените '=' на '==', иначе он не будет работать так, как ожидалось. – briosheje

+2

@briosheje Это не синтаксическая ошибка. В PHP это действительно. – medowlock

+1

Другая проблема заключается в том, что ключи в массиве должны быть строками ... – medowlock

ответ

2
$result = array(); 

// Make $result an associative array, containing contents of $array1 
foreach ($array1 as $e) { 
    $e['val3'] = 0; // val3 defaults to 0 
    $result[$e['val1']] = $e; 
} 

// Now merge in $array2 
foreach ($array2 as $e) { 
    if (isset($result[$e['val1']])) { 
     $result[$e['val1']]['val3'] = $e['val3']; 
    } else { 
     $e['val2'] = 0; // val2 defaults to 0 
     $result[$e['val1']] = $e; 
    } 
} 

// Convert to indexed array 
$result = array_values($result); 

Кстати, правильный способ создания входных массивов:

$array1 = array(array('val1' => 'abc', 'val2' => '5'), 
       array('val1' => 'bcd', 'val2' => '2') 
); 

$array2 = array(array('val1' => 'abc', 'val3' => '1'), 
       array('val1' => 'zzz', 'val3' => '3') 
); 
+0

не лучший способ сделать это так: '$ array1 = array (" abc "=> 5," bcd "=> 2);', потому что в вопросе это не многомерный массив –

+0

@MaartenPeels yea the «Результат должен быть следующим», можно интерпретировать по-разному, OP должен опубликовать требуемый вывод 'print_r'. я собирался прокомментировать это, но ответ был принят, поэтому никакого вреда не было. – Sharky

+0

Посмотрите на таблицы 'array1:' и 'array2:' в вопросе, это похоже на многомерный массив для меня. – Barmar