合并2个数组并组合数字键的结果

时间:2013-05-31 11:30:06

标签: php arrays

我有2个数组,我希望通过每个数字键合并/组合在一起。 例如

Array1
(
    [2009] => 131
    [2008] => 940
    [2007] => 176
    [2006] => 1
)
Array2
(
    [2008] => 9
    [2007] => 3
)

我希望输出为:

Array (
    [2009] => 131
    [2008] => Array (
                     [0]=>940
                     [1]=>9
                    )
    [2007] => Array (
                     [0]=>176
                     [1]=>3
                    )
    [2006] => 1
)

我到底如何实现这一目标?我已经尝试过array_merge,但是我丢失了我的密钥并且它们没有被分组。

9 个答案:

答案 0 :(得分:1)

如果我看到了正确的你只想要那些键来保存数组,那么引用 more 而不是单个值。其他键仍应引用标量值......

所以你需要一个两步策略:

// 1.) turn _all keys into arrays
foreach (array($input1,$input2) as $array)
    foreach ($array1 as $key=>$val)
        $output[$key][]=$val;
// 2.) reconvert elements with single entry to a scalar value again
foreach ($output as $key=>$candidate)
    if (1==count($candidate))
        $output[$key]=$candidate[0];
// test output
print_r($output);

答案 1 :(得分:1)

你为什么不写一个合并它们的方法?

/**
Merge original_array with new_array
@param array original_array
@param array new_array
*/
function merge_array($original_array, $new_array)
{
    $merged_array = array();
    if(is_array($original_array) && is_array($new_array))
    {
        foreach($original_array as $key => $value)
        {
            $merged_row[] = $value;
            if(isset($new_array[$key]))
            {
                $merged_row[] = $new_array[$key];
            }
            $merged_array[$key] = $merged_row;
        }
    } else $merged_array = $original_array;
    return $merged_array;
}

答案 2 :(得分:1)

只是对此进行了单元测试。它应该联合数组。请注意,它可以在性能方面得到改善。没有关联键的项将被分组为键'0'。

   public function merge(&$ar, $ar2) {
      foreach ($ar as $k => $v) {
         if (isset($ar2[$k])) {
            $ar[$k] = array_merge(array($ar[$k]), array($ar2[$k]));
         }
      }

      foreach ($ar2 as $k => $v) {
         if (!isset($ar[$k])) {
            $ar[$k] = $ar2[$k];
         }
      }    
    }

单元测试:

public static function test_merge() {
      $ar1 = array(45, 'a' => 44, 'dog' => array(1), 'cat' => 3);
      s($ar1, array(2, 'dog' => 2, 'cat' => 4, 'stuff' => 4.3));
      print_r($ar1);
}

结果:

IArray
(
    [0] => Array
        (
            [0] => 45
            [1] => 2
        )

    [a] => 44
    [dog] => Array
        (
            [0] => Array
                (
                    [0] => 1
                )

            [1] => 2
        )

    [cat] => Array
        (
            [0] => 3
            [1] => 4
        )

    [stuff] => 4.3
)

答案 3 :(得分:1)

<?php
$arrOne = array( 2009 => 131,  2008 => 940,  2007 => 176,  2006 => 1);
$arrTwo = array( 2008 => 9, 2007=> 3, 2011 => 67);
$output = array();


foreach($arrOne as $key=>$value){
  if(isset($arrTwo[$key])){
    $output[$key][] = $value;
    $output[$key][] = $arrTwo[$key];
  }
  else{
    $output[$key] = $value;
  }
}

$output += $arrTwo;    // To consider keys that were absent in $arrOne 
print_r($output);

?>

检查http://codepad.org/FrIlKRqk

中的输出

结果

Array
(
[2009] => 131
[2008] => Array
    (
        [0] => 940
        [1] => 9
    )

[2007] => Array
    (
        [0] => 176
        [1] => 3
    )

[2006] => 1
[2011] => 67
)

答案 4 :(得分:0)

两个数组都使用相同的键,所以你可以做这样简单的事情(虽然只适用于一个级别):

foreach ($array2 as $key => $value)
{
    $array1[$key][] = $value
}

<强>更新

$array3 = array()
foreach ($array1 as $key => $value)
{
    $array3[$key][] = $value
}
foreach ($array2 as $key => $value)
{
    $array3[$key][] = $value
}

答案 5 :(得分:0)

像这样的事吗?如果为每个Array(array1,array2,...)

运行这样的循环
$list = array()

foreach( $array1 as $key => $value ){
    if( !array_key_exist( $key, $array) ){
        $list[$key] = $value
    } else if( !is_array( $list[$key] ) ) {
        $list[$key] = array(list[$key])
    } else {
        array_push( $list[$key], $value );
    }
}

nb。:代码未经过测试......

答案 6 :(得分:0)

尝试:

foreach ($your_array as $key => $value)
    $array_new[$key][] = $value;
print_r($array_new);

答案 7 :(得分:0)

我看到很多答案,但我发现它们无法使用,所以我加入了自己的

function merge(){
    $args = func_get_args();
    $new = array();
    foreach($args as $arg){
        foreach($arg as $key => $item){
            if(!isset($new[$key])){
                $new[$key] = $item;
            }else if (!is_array($new[$key)){
                $new[$key] = array($new[$key],$item);
            }else{
                $new[$key][] = $item;
            }
        }
    }
    return $new;
}

你可以加入无限的论点:)

答案 8 :(得分:0)

我最终发现这个功能对我很有帮助。谢谢大家的意见。

function merge_common_keys()
{
    $arr  = func_get_args();
    $num  = func_num_args();
    $keys = array();
    $i    = 0;
    for ($i = 0; $i < $num; ++$i) {
        $keys = array_merge($keys, array_keys($arr[$i]));
    }
    $keys   = array_unique($keys);
    $merged = array();
    foreach ($keys as $key) {
        $merged[$key] = array();
        for ($i = 0; $i < $num; ++$i) {
            $merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null;
        }
    }
    return $merged;
}