【问题标题】:PHP: merge two arrays, distinct on first key, sum second keyPHP:合并两个数组,第一个键不同,第二个键相加
【发布时间】:2013-01-23 23:56:33
【问题描述】:

我有两个数组:

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

合并后的数组应如下所示:

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

我尝试了很多建议,其中之一是:

 $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');

我应该怎么做?非常感谢任何建议

编辑:在阅读了一些 cmets 之后,我意识到我应该更清楚。见下文

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' 变为 1x a => '501' 并且它的 'b' 键变为 '3'(求和)

和:1x a=> '505' 和 b => '1'

和:1x a=> '509' 和 b => '1'

【问题讨论】:

  • 数组总是有两个键吗?两个键总是相同的吗?钥匙固定了吗?
  • 键 'a' 可以不同,例如可以是 501 - 502 - 503。键“b”也可以不同。 'a' 可能永远不会重复,而应该合并 'a'。
  • 如果值不同,a键在合并数组中应该是什么?
  • 感谢您的回复,您让我意识到我应该以不同的方式提出我的问题,请参阅更新后的问题

标签: php arrays merge sum


【解决方案1】:
$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));

【讨论】:

  • 感谢 dimaninc,您的解决方案非常接近。输出让我意识到我没有很好地提出我的问题。请查看更新后的问题
  • 我已经阅读了您的更新,但仍然不明白您到底需要什么:) 请显示所有三个或四个非序列化形式的输入数组和非序列化形式的输出输出数组,然后我会尝试帮助你
【解决方案2】:

您可以构建一个以“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);

并将键值数组转换回您的 a/b 结构。我不知道它应该是什么样子,因为我不能流利地读取序列化数组。因此,如果您需要帮助,请将所需的输出显示为未序列化的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2011-09-27
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多