【问题标题】:Sum values of duplicate keys in a simple and single array and display that key only once in PHP在一个简单的单一数组中对重复键的值求和,并在 PHP 中只显示一次该键
【发布时间】:2016-12-07 15:19:12
【问题描述】:

我在我的网站中有一个用字符串创建的数组:

$items = '"1010" => "3", "1010" => "1", "1020" => "2", "1030" => "6"'; //string
$items_element = array(); //this is the created array
$items_bits = explode(",", $items);
foreach ($items_bits as $i) {
    $i = str_replace('"', '', $i);
    $i_bobs = explode(" => ", $i);
    $items_element[$i_bobs[0]] = $i_bobs[1];
}

为了得到这个数组的结果,我使用了foreach() 循环:

foreach($items_element as $item_id => $item_count){
    echo $item_id.': '.$item_count.'</br>';
}

现在,结果是这样的:

1010: 3

1010: 1

1020:2

1030:6

我需要所有重复的键只显示一次,但它们的值必须彼此相加。

示例:

1010: 4

1020:2

1030:6

我该如何做这样的事情?我已经尝试过很多不同的方式,但事实是我迷路了,不知道如何得到这个结果。所以我希望有人可以在这里启发我的想法......

【问题讨论】:

标签: php arrays sum duplicates


【解决方案1】:

如下改变你的循环:

foreach ($items_bits as $i) {
    $i = str_replace('"', '', $i);
    $i_bobs = explode(" => ", $i);
    if (!isset($items_element[trim($i_bobs[0])]))
        $items_element[trim($i_bobs[0])] = 0;
    $items_element[trim($i_bobs[0])] += (int)$i_bobs[1];
}

trim() 被添加,因为数组的第二个索引以空格开头(例如“1010”而不是“1010”)。这也是为什么您在结果数组中出现重复的原因。如果不是这种情况,键将被最后一次出现的覆盖。

【讨论】:

  • 我在这里测试过,效果很好!谢谢。由于我是从php语言开始的,请原谅我缺乏知识,所以trim()的功能是删除字符串的空格?
  • @user3050478:确实,trim() 删除了字符串开头和结尾的空白字符(例如空格、制表符、换行符……)。请参阅documentation 了解更多信息。
  • 非常感谢@Jiri Hrazdil,你不知道这对我有多大帮助,不仅仅是完成这些代码行,但我实际上从中学到了一些东西!
【解决方案2】:
$items = '"1010" => "3", "1010" => "1", "1020" => "2", "1030" => "6"'; //string
$items_element = array(); //this is the created array
$items_bits = explode(",", preg_replace('/\s+/', '', $items));

foreach($items_bits as $value) {
    $value_exploded = explode('=>', $value);

    $value_exploded_key = (int)str_replace('"', '', $value_exploded[0]);
    $value_exploded_value = (int)str_replace('"', '', $value_exploded[1]);
    $value_exploded_value = !isset($items_element[$value_exploded_key]) ? $value_exploded_value : $items_element[$value_exploded_key] + $value_exploded_value;

    $items_element[$value_exploded_key] = $value_exploded_value;
}

var_dump($items_element);

【讨论】:

  • 感谢@Perumal93 分享您的方法,我只是快速测试了一下,没有发现任何错误。不过我还是会使用第一个,因为它已经应用到我的代码中,而且看起来更简单。
  • 是的。第一个看起来更简单。即使是这样,我也分享了我的方法。我使用了三元表达式而不是 if else 语句。也许那会让你觉得有点复杂。
猜你喜欢
  • 1970-01-01
  • 2021-07-04
  • 2019-07-13
  • 2015-12-13
  • 2022-08-11
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多