2

我有 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 但我丢失了我的密钥并且它们没有被分组。

4

9 回答 9

1

如果我没看错,您只希望那些键保存一个数组,该数组引用多个值。其他键仍应引用标量值...

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

// 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);
于 2013-05-31T11:35:19.307 回答
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;
}
于 2013-05-31T11:35:43.447 回答
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
)
于 2013-05-31T11:51:34.823 回答
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
)
于 2013-05-31T11:54:01.617 回答
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 );
    }
}

注意:代码没有经过测试……</p>

于 2013-05-31T11:36:24.760 回答
0

尝试:

foreach ($your_array as $key => $value)
    $array_new[$key][] = $value;
print_r($array_new);
于 2013-05-31T11:36:36.167 回答
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
}
于 2013-05-31T11:34:21.377 回答
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;
}
于 2013-06-04T11:04:09.713 回答
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;
}

你可以提出无限的论点:)

于 2013-05-31T12:00:08.050 回答