0

次のような複数の連想配列があります。

$arr1 = array(0 => 12, 5 => 10, 19 => 48);
$arr2 = array(0 => 14, 7 => 9, 12 => 11, 19 => 30);

これらの配列をマージして、キーの単一セット (0、5、7、12、19) を持ち、それぞれが元の配列の値を持つ配列を指すようにしたいと思います。null値が存在しない場合元の配列:

$merge = array(
    0 => array(12, 14),
    5 => array(10, null),
    7 => array(null, 9),
    12 => array(null, 11),
    19 => array(48, 30)
);

任意の数の配列に対してこれを実行できる必要があります。どこから始めればよいかわかりません。

私は、各配列を反復処理して、その値を結果に追加することができると思いますが、現在の値をそのインデックスに追加する前に、結果の各配列に必要な数の要素があるかどうかを確認する必要があります-これはそうではありませんひどく効率的ではありません。

アイデアや指針は?

4

4 に答える 4

1

編集

<?php
$arr1 = array(0 => 12, 5 => 10, 19 => 48);
$arr2 = array(0 => 14, 7 => 9, 12 => 11, 19 => 30);

foreach($arr1 as $k => $v){
 if(array_key_exists($k, $arr2)){
   $newarr[$k][] = $v;
   $newarr[$k][] = $arr2[$k];
 }else{
   $newarr[$k][] = $v;
   $newarr[$k][] = 'NULL';
 }
}

foreach($arr2 as $k => $v){
 if(!array_key_exists($k, $arr1)){
   $newarr[$k][] = 'NULL';
   $newarr[$k][] = $v;
 }
}

ksort($newarr);

echo '<pre>';
print_r($newarr);
?>

出力:

   Array
(
    [0] => Array
        (
            [0] => 12
            [1] => 14
        )

    [5] => Array
        (
            [0] => 10
            [1] => NULL
        )

    [7] => Array
        (
            [0] => NULL
            [1] => 9
        )

    [12] => Array
        (
            [0] => NULL
            [1] => 11
        )

    [19] => Array
        (
            [0] => 48
            [1] => 30
        )

)
于 2013-02-20T18:36:11.467 に答える
1
    $arr1 = array(0 => 12, 5 => 10, 19 => 48);
    $arr2 = array(0 => 14, 7 => 9, 12 => 11, 19 => 30);

    $keys = array_merge(array_keys($arr1), array_keys($arr2));
    $merged = array();
    foreach ($keys as $key) {
        $merged[$key] = array(); 
        $merged[$key][] = isset($arr1[$key]) ? $arr1[$key] : null;
        $merged[$key][] = isset($arr2[$key]) ? $arr2[$key] : null;            
    }
    ksort($merged);
    echo '<pre>', var_dump($merged), '</pre>';

任意の数の配列用に変更

    $arrays = array(
        array(0 => 12, 5 => 10, 19 => 48),
        array(0 => 14, 7 => 9, 12 => 11, 19 => 30),
        // ... more arrays
    );

    $keys = array();
    foreach ($arrays as $arr) {
        $keys = array_merge($keys, array_keys($arr));
    }

    $merged = array();
    foreach ($keys as $key) {
        $merged[$key] = array();
        foreach ($arrays as $arr) {
            $merged[$key][] = isset($arr[$key]) ? $arr[$key] : null;
        }         
    }
    ksort($merged);
    echo '<pre>', var_dump($merged), '</pre>';
于 2013-02-20T19:05:15.800 に答える
1

これがあなたが探しているものだと思います。

/*Merge function*/
function merge($a1, $a2)
{
    foreach($a1 as $key => $val)
        $a1[$key] = Array($a1[$key], null);
    foreach($a2 as $key => $val)
        $a1[$key] = Array((isset($a1[$key]))? $a1[$key][0]: null, $val);
    return ksort($a1);
}

/*Test*/
$arr1 = array(0 => 12, 5 => 10, 19 => 48);
$arr2 = array(0 => 14, 7 => 9, 12 => 11, 19 => 30);

foreach(merge($arr1, $arr2) as $key => $val){
    echo "<br />$key --";
    print_r($val);
}
/*output*/
0 --Array ( [0] => 12 [1] => 14 )
5 --Array ( [0] => 10 [1] => )
7 --Array ( [0] => [1] => 9 )
12 --Array ( [0] => [1] => 11 ) 
19 --Array ( [0] => 48 [1] => 30 )
于 2013-02-20T18:59:15.113 に答える
0

この機能を試してください:

   function multimerge ($array1, $array2) {
      if (is_array($array2) && count($array2)) {
         foreach ($array2 as $k => $v) {
            if (is_array($v) && count($v)) {
                $array1[$k] = multimerge($array1[$k], $v);
            } else {
                $array1[$k] = $v;
            }
         }
       } else {
          $array1 = $array2;
       }

       return $array1;
   }

http://php.net/manual/en/function.array-merge.php

于 2013-02-20T18:41:23.947 に答える