2

これは言葉で説明するのは難しいですが、基本的には 2 つの配列を取り、それらを一意の値でマージし、列の 1 つを合計する必要があります。以下に書き出すと、より理にかなっています。

$a = array(
   0 => array(
      'ID' => 1,
      'Count' => 2
   ),
);

$b = array(
   0 => array(
      'ID' => 1,
      'Count' => 4,
   ),
   1 => array(
      'ID' => 2,
      'Count' => 3,
   ),
);

最終製品は次のようにする必要があります。

$a_plus_b = array(
    0 => array(
       'ID' => 1,
       'Count' => 6,
    ),
    1 => array(
       'ID' => 2,
       'Count' => 3,
    ),        
);

array_merge() と array_unique() のさまざまなバリエーションで遊んでいますが、必要なことを効率的に行う方法が見つかりません。ネストされたループをいつでも実行できることはわかっていますが、もっと簡単なものを望んでいました。何か案は?

4

2 に答える 2

2

これでうまくいくはずです

注:このソリューションには PHP が必要>= 5.3です。以下に PHP < 5.3 のソリューションがあります。

$input = array($a, $b);
// add as many result arrays to $input as you want; e.g.,
// $input = array($a, $b, $c, $d);

$output = array_count_values(
  call_user_func_array(
    'array_merge',
     array_map(
       function($arr) {
         return array_fill(0, $arr['Count'], $arr['ID']);
       },
       call_user_func_array(
         'array_merge',
         $input
       )
     )
  )
);

print_r($output);

出力

Array
(
    [1] => 6
    [2] => 3
)

上記の配列キーはID値であることに注意してください。配列値はCount値です。


PHP を実行している場合は< 5.2、インライン クロージャを使用できませんarray_fill。別の関数として定義する必要があります。

$input = array($a, $b);

function _fill($arr) {
  return array_fill(0, $arr['Count'], $arr['ID']);
}

$output = array_count_values(
  call_user_func_array(
    'array_merge',
    array_map(
      '_fill',
      call_user_func_array(
        'array_merge',
        $input
      )
    )
  )
);

print_r($output);

ここから、出力を目的の形式に変換するのは簡単な作業です。

于 2012-12-21T19:25:14.917 に答える