3

私は2つの配列を持っています:

$array1 = array (a => '501', b => '1');
$array2 = array (a => '501', b => '2');

マージされた配列は次のようになります。

$merged_array = array (a => '501', b => '3');

私は多くの提案を試しましたが、そのうちの1つは次のとおりです。

 $sums = array();
  foreach (array_keys($array1 + $array2) as $key) {
    $sums[$key] = (isset($array[$key]) ? $array[$key] : 0) + (isset($array2[$key]) ? $array2[$key] : 0);
  }

しかし、これは次の結果になります。

$merged_array = array (a => '1002', b => '3');

これはどのようにすればよいですか?どんなアドバイスも大歓迎です

編集:いくつかのコメントを読んだ後、私はもっと明確にすべきだったと気づきました。下記参照

4つの配列、「a」の重複に注意してください。

  $array1 = array (a => '501', b => '1');
  $array2 = array (a => '501', b => '2');
  $array3 = array (a => '505', b => '1');
  $array4 = array (a => '509', b => '1');

4つのマージされたアレイとシリアル化されたものは次のようになります

a:2:{s:1:"a";i:501;s:1:"b";i:3; s:1:"a";i:505;s:1:"b";i:1; s:1:"a";i:509;s:1:"b";i:1;}

つまり、2x a=>'501'は1xa=> '501'になり、'b'キーは'3'になります(合計)

および:1x a=>'505'およびb=>'1'

および:1x a=>'509'およびb=>'1'

4

2 に答える 2

3
$array1 = array (a => '501', b => '1');
$array2 = array (a => '501', b => '2');

function super_merge($a1, $a2)
{
  $a = array();
  $k_ar = array_keys($a1 + $a2);

  foreach ($k_ar as $k)
  {
    if (isset($a1[$k]) && isset($a2[$k]) && $a1[$k] == $a2[$k])
      $a[$k] = $a1[$k];
    else
      $a[$k] = (isset($a1[$k]) ? $a1[$k] : 0) + (isset($a2[$k]) ? $a2[$k] : 0);
  }

  return $a;
}

var_dump(super_merge($array1, $array2));
于 2013-01-24T00:07:08.523 に答える
1

'a'値をキーとして、'b'値を値として配列を作成できます

function map_a_to_b($array) {
    return array($array['a'] => $array['b'];
}

map_a_to_bすべての入力配列に適用します。次に、配列を再帰的にマージできます。

$merged = array_merge_recursive($array1, $array2, $array3, $array4);

結果は(あなたの例では)次のようになります:

  array ('501' => array('1', '2'),
         '505' => '1',
         '509' => '1')

次に、次のように内部配列を合計します。

$summed = array_map(function($item) { return array_sum((array) $item); }, $merged);

そして、Key-Value配列をa/b構造に変換し直します。シリアル化された配列を流暢に読み取ることができないため、どのように表示されるかはわかりません。そのため、サポートが必要な場合は、目的の出力をシリアル化されていない配列として表示してください。

于 2013-01-24T09:47:10.020 に答える