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

私がその権利を確認した場合、それらのキーに配列を保持させたいだけで、それは複数の値を参照します。他のキーは引き続きスカラー値を参照する必要があります...

したがって、次の 2 段階の戦略が必要です。

// 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 に答える
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 に答える
0

どちらの配列も同じキーを使用するため、次のような簡単なことを行うことができます (ただし、1 つのレベルでのみ機能します)。

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

おそらくそのようなものですか?このようなループを各配列 (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 に答える