2017-04-26 158 views
0

我有这三个数组:阵列合并以相同的密钥

Array 
(
    [1] => [email protected] 
    [2] => [email protected] 
    [3] => [email protected] 
) 

Array 
(
    [1] => 
    [2] => 4234235 
    [3] => 
) 

Array 
(
    [2] => 1 
) 

我想产生这样的输出:

Array 
(
    [1] => array(
      [0] => [email protected] 
      ) 
    [2] => array(
      [0] => [email protected] 
      [1] => 4234235 
      [2] => 1 
      ) 
    [3] => array(
      [0] => [email protected] 
      ) 
) 

我需要一些帮助,因为我已经研究array_merge_recursive()array_merge(),但我无法得到正确的结果。

如果我需要使用foreach()我必须做些什么来合并这3个数组。

回答

4

写了一个小脚本:

$a = array 
(
    1=>"[email protected]", 
    2=>"[email protected]", 
    3=>"[email protected]", 
); 

$b = array 
(
    2 => 4234235 
); 

$c = array 
(
    2 => 1 
); 

$arrayKeys = array_unique(
    array_merge(
     array_keys($a), 
     array_keys($b), 
     array_keys($c) 
    ) 
); 

$d = array_combine(
    $arrayKeys, 
    array_fill(
     0, 
     count($arrayKeys), 
     array() 
    ) 
); 

foreach($a as $key => $value) { 
    if(!empty($a[$key])) { 
     $d[$key][] = $a[$key]; 
    } 
    if(!empty($b[$key])) { 
     $d[$key][] = $b[$key]; 
    } 
    if(!empty($c[$key])) { 
     $d[$key][] = $c[$key]; 
    } 
} 
var_dump($d); 

此外,如果你愿意,你可以使用变量名称仅

//names of the variables to merge together 
$arrayVariableNames = array("a","b","c"); 

//merging array keys together 
$arrayKeys = array(); 
foreach($arrayVariableNames as $variableName) { 
    $arrayKeys = array_merge(
     $arrayKeys, 
     array_keys(${$variableName}) 
    ); 
} 
$arrayKeys = array_unique($arrayKeys); 

//initialize the result array with empty arrays 
$resultArray = array_combine(
    $arrayKeys, 
    array_fill(
     0, 
     count($arrayKeys), 
     array() 
    ) 
); 

//loop through all the keys and add the elements from all the arrays 
foreach($resultArray as $key => &$value) { 
    foreach($arrayVariableNames as $variableName) { 
     if(!empty(${$variableName}[$key])) { 
      $value[] = ${$variableName}[$key]; 
     } 
    } 
} 
+0

如果'$ b'或'$ c'数组的值比'$ a'数组多? – Bhaskar

+0

编辑所以现在没关系 –

1

至于你有没有怀疑发现,array_merge_recursive()固执地捣毁所有合并的阵列一起数字或“数字字符串”键转换为一维数组。为了避免这种行为,您需要将每个数组的初始键作为字符串转换,而不会被假定为array_merge_recursive()的数字。

此外,你想筛选出所有具有空值的元素。

我最初编写了一个单线程,执行关键重新铸造然后过滤值,但效率不那么高。对于您的情况,您应该只在可能有包含空值的阵列上使用array_filter()

输入数组:

$a=[1=>"[email protected]",2=>"[email protected]",3=>"[email protected]"]; 
$b=[1=>"",2=>"4234235",3=>""]; 
$c=[2=>1]; 

代码:

// remove empty values from all arrays that may have them 
$b=array_filter($b,'strlen'); 

// for all arrays, cast numeric keys to string by prepending with a space 
function addK($v){return " $v";} 
$a=array_combine(array_map('addK',array_keys($a)),$a); 
$b=array_combine(array_map('addK',array_keys($b)),$b); 
$c=array_combine(array_map('addK',array_keys($c)),$c); 

// merge arrays recursively 
$merged=array_merge_recursive($a,$b,$c); 

// cast keys back to numeric 
$merged=array_combine(array_map('trim',array_keys($merged)),$merged); 

// force all top-level elements to be arrays 
foreach($merged as $k=>$v){ 
    if(is_string($merged[$k])){$merged[$k]=[$v];} 
} 

var_export($merged); 

输出:

array (
    1 => array (
     0 => '[email protected]', 
    ), 
    2 => array (
     0 => '[email protected]', 
     1 => '4234235', 
     2 => 1, 
    ), 
    3 => array (
     0 => '[email protected]', 
    ), 
) 

对于谁想要知道其中的差别读者当array_merge_recursive()运行没有准备:

array (
    0 => '[email protected]', 
    1 => '[email protected]', 
    2 => '[email protected]', 
    3 => '', 
    4 => '4234235', 
    5 => '', 
    6 => 1, 
) 

注意1d数组和重新索引的键?对OP来说完全没用。

最后,对于任何想要将所有数组的键重新投射并想让我的过程更加干燥的人,可能有机会设置可变参数函数或类似函数。我只是懒得去追求这个概念,因为我不想让自己的答案变得更复杂,也不是可怕的重复自己。

+0

我很喜欢katona.abel的方法,它们很聪明。虽然有几点不同。第一种方法赋予了数组'$ a'的循环权限,然后OP发表评论,要求提供一种新的方法,允许$ b和$ c中有更多的元素。第二种方法(我不太喜欢它,但它确实使用变量来完成'array_merge_recursive()'的设计目的。我跑了一些测试,并且katona的第二种方法似乎没有突破 - 好的编码!如果任何人都可以找到我们的任何方法的缺陷,请给我们留言。 – mickmackusa

相关问题