2011-05-12 141 views
1

我有幾個關聯數組,我需要根據那些關鍵將它們合併到一起。 這樣:PHP基於密鑰將多個關聯數組添加到新數組中

array1: 
[person1] => tony 
[person2] => sandra 

array2: 
[person1] => london 
[person2] => paris   

需求是:

array 3 
    [person1] => tony , london 
    [person2] => sandra , paris 

我有但問題是,鍵可以是任意值,所以它可能是「PERSON1」也可以是「hairyOtter '而陣列的大小是可變的。

+0

不清楚您希望array3中的值是字符串還是另一個數組。 – jmtd 2011-05-12 14:17:38

+0

另一個陣列。謝謝。 – BobFlemming 2011-05-12 14:22:05

回答

3

假設,每一個不多維

$merged = array_merge_recursive($array1, $array2); 
foreach ($merged as &$entry) { 
    if (is_array($entry)) { 
    $entry = implode(', ', $entry); 
    } 
} 

的想法是,array_merge_recursive()創建新的數組,如果找到相同的密鑰兩個值。其他一切都保持不變。

+0

比我笨拙的解決方案更好:) – 2011-05-12 14:21:28

+0

array_merge_recursive救援! – BobFlemming 2011-05-12 14:39:08

0

兩個循環應該這樣做。迭代array1和array2中的每一個,在進入數組時,初始化array3的鍵,並推入該數組。這是第一個循環

$array3 = array(); 
foreach (array_keys($array1) as $key) { 
    if(!array_key_exists($key, $array3)) { 
     $array3[$key] = array(); 
    } 
    array_push($array3[$key], $array1[$key]); 
} 
+0

如果$ array2中有一個不在array1中的鍵,則不適用。用你的解決方案,這將被忽略。 – 2011-05-12 14:22:27

+0

你錯了。我的解決方案完全忽略了$ array2,但是如果您複製並粘貼整個'foreach',將'array1'替換爲'array2',鍵仍然會進入 - 它仍然是一個聯合。 – jmtd 2011-05-12 14:24:09

1

我敢肯定有更有效的方式來做到這一點,但現在,這個工程:

<?php 
function combine($keys, $first, $second) { 
    $args = func_get_args(); 
    $keys = array_shift($args); 
    $arrays = $args; 
    $result = array(); 

    foreach($keys as $key) { 
     foreach($arrays as $array) { 
      if(isset($array[$key])) { 
       $result[$key][] = $array[$key]; 
      } 
     } 
    } 
    return $result; 
} 

$first = array(
    'person1' => 'tony', 
    'person2' => 'sandra' 
); 

$second = array(
    'person1' => 'london', 
    'person2' => 'paris' 
); 


/** 
* To make sure you get *every* key out of both arrays. 
*/ 
$keys = array_unique(array_merge(array_keys($first), array_keys($second))); 

$combined = combine($keys, $first, $second); 
var_dump($combined); 
0
$array1 = array('a' => 1, 'b' => 2); 
$array2 = array('a' => 3, 'b' => 4, 'c' => 5); 

foreach ($array1 as $k => $v) { 
    $tArray[$k][] = $v; 
} 
foreach ($array2 as $k => $v) { 
    $tArray[$k][] = $v; 
} 

foreach ($tArray as $k => $v) { 
    $tArray[$k] = implode(',',$tArray[$k]); 
} 
0

我會創建一個多維數組,而不是,除非有特定的原因你不能使用一個。通過這種方式,您將擁有一個如下所示的數組:

Array 
(
[Person1] => Array 
    (
    [Name] => Tony 
    [City] => London 
) 
[Person2] => Array 
    (
    [Name] => Sandra 
    [City] => Paris 
) 
)