比较两个数组时,将可能的值合并到数组中

时间:2013-07-02 18:19:20

标签: php arrays merge

我正在寻找合并两个数组的简单解决方案。除了一个键值对外,它们看起来大都相似。我希望我的结果有一个包含两个可能值的数组。

xdebugged数组看起来像这样(简化):

array (size=3)
    'entry' => string '18' (length=2)        
    'mykey' => string 'value1' (length=6) // here is the difference
    'something' => string '1' (length=1)
array (size=3)
    'entry' => string '18' (length=2)        
    'mykey' => string 'value2' (length=6)) // here is the difference
    'something' => string '1' (length=1)

我希望结果如下:

array (size=2)
    'entry' => string '18' (length=2)        
    'mykey' => array (size=2)) // both values merged to array
         '0' => 'value1' (length=6)
         '1' => 'value2' (length=6)
    'something' => string '1' (length=1)

如何轻松实现这一目标?

3 个答案:

答案 0 :(得分:0)

这样就足够了:

<?php
$array1 = array(
    'entry'=>'18',
    'mykey'=>'value1',
    'something'=>'1'
);
$array2 = array(
    'entry'=>'18',
    'mykey'=>'value2',
    'something'=>'1'
);

$output = array();
foreach($array1 as $k=>$v){
    if(isset($array2[$k]) && $array2[$k] === $v){
        $output[$k] = $v;
    }elseif(isset($array2[$k])){
        $output[$k][] = array($v,$array2[$k]);
    }else{
        $output[$k] = $v;
    }
}

foreach($array2 as $k=>$v){
    if(!array_key_exists($k,$output)){
        $output[$k] = $v;
    }
}

echo '<pre>',print_r($output),'</pre>';

修改:我确实喜欢使用Ziarno提到的array_merge_recursive(),但问题是它会为每个密钥创建一个数组。所以我添加了array_unique()的使用,然后检查长度是否为1,如果是,则将其展平。

$output = array_merge_recursive($array1, $array2);

foreach($output as $k=>&$v){
    $v = array_unique($v);
    if(count($v)==1){
        $v = $v[0];
    }
}

echo '<pre>',print_r($output),'</pre>';

答案 1 :(得分:0)

您需要为此编写自己的自定义代码。

// Get all the key values.
foreach($arrays as $array){
$keys[] = $array['mykey']
}

// retain 1st element & discard others.
$array = array_slice($arrays, 0, 1);

// update to the 1st array element
$array['mykey'] = $keys;

// print
print_r($array);

希望这会有所帮助。

答案 2 :(得分:0)

我认为this功能设计为完全以满足您的需求:

array_merge_recursive($array1, $array2)