首页 > 解决方案 > PHP多维数组 - 删除部分重复并加起来

问题描述

我有一个像这样的多维数组:

array(4) {
    [0] => array(2) {
        [0] => string(15)
        "One" 
        [1] => string(5)
        "11:31"
    }
  [1] => array(2) {
        [0] => string(4)
        "Two" 
        [1] => string(5)
        "11:31"
    }
  [2] => array(2) {
        [0] => string(15)
        "Three" 
        [1] => string(5)
        "11:31"
    }
  [3] => array(2) {
        [0] => string(4)
        "One" 
        [1] => string(5)
        "11:31"
    }
}

我正在尝试删除第一个值但加在一起的值。所以它最终会像这样:

array(3) {
    [0] => array(2) {
        [0] => string(15)
        "One" 
        [1] => string(5)
        "22:62"
    }
  [1] => array(2) {
        [0] => string(4)
        "Two" 
        [1] => string(5)
        "11:31"
    }
  [2] => array(2) {
        [0] => string(15)
        "Three" 
        [1] => string(5)
        "11:31"
    }
}

请注意,最后一个“一”已被删除,数组中的第二个值已从两个 11:31 到 22:62 相加。我希望这是有道理的。

有什么东西或一个特定的功能我应该看看把我推向正确的方向吗?非常感谢任何帮助。

这不仅仅是从我所知道的内容中直接删除重复项,因为尽管第二个值在此示例中,但没有一个是完全相同的,它们不会出现在实时数据中。

标签: phparrays

解决方案


您可以使用 key 创建一个循环并将元素分组到一个新数组中[0]。如果新数组中不存在密钥,只需添加新数组即可。否则,您可以解析现有值以添加新值:

$array = [
  ["One", "11:31"],
  ["Two", "11:31"],
  ["Three", "11:31"],
  ["One", "11:31"],
];

$out = [];
foreach ($array as $item) {
  // if $item[0] is not an existing key,
  if (!isset($out[$item[0]])) {
    // add $item as-is
    $out[$item[0]] = $item;
  } else {

    // parse current time
    list($h1, $m1) = explode(':', $item[1]);
    $m1 += $h1 * 60;

    // parse existing time
    list($h2, $m2) = explode(':', $out[$item[0]][1]);
    $m1 += $m2 + $h2 * 60;

    // compute new time
    $h = floor($m1 / 60);
    $out[$item[0]][1] = sprintf("%02d:%02d", $h, $m1-$h*60);
  }
}
// array_values removes 'named' keys. 
print_r(array_values($out));

输出(浓缩):

Array
(
    [0] => Array ([0] => One [1] => 23:02)
    [1] => Array ([0] => Two [1] => 11:31)
    [2] => Array ([0] => Three [1] => 11:31)
)

推荐阅读