2011-05-12 47 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 
) 
) 
相关问题