如何在匹配键上合并数组,同时添加其他数组的数值

问题描述 投票:0回答:1

我在这里发表的第一篇文章,尽管多年来我一直在从你们那里收集知识。 我正在尝试合并以下名称匹配的数组,但我需要将小时数添加在一起。
我尝试的一切都会给出疯狂的结果或给出我无法找到答案的错误。

数组示例:

Array (
    [0] => Array (
        [name] => Hunter
        [hours] => 4.00 )
    [1] => Array (
        [name] => Hunter
        [hours] => 4.00 )
    [2] => Array (
        [name] => Leon
        [hours] => 8.00 )
    [3] => Array (
        [name] => Rowdy
        [hours] => 8.00 )
    [4] => Array (
        [name] => Hunter
        [hours] => 8.00 )
    [5] => Array (
        [name] => Lonnie
        [hours] => 8.00 )
    [6] => Array (
        [name] => Leon
        [hours] => 8.00 )
    [7] => Array (
        [name] => Gavin
        [hours] => 8.00 )
    )

期望的结果:

Array (
    [0] => Array (
        [name] => Hunter
        [hours] => 16.00 )
    [1] => Array (
        [name] => Leon
        [hours] => 16.00 )
    [2] => Array (
        [name] => Rowdy
        [hours] => 8.00 )
    [3] => Array (
        [name] => Lonnie
        [hours] => 8.00 )
    [4] => Array (
        [name] => Gavin
        [hours] => 8.00 )
    )

这段代码有效......有点......它将名称的第一个实例添加两次。这样就给了猎人额外的4个小时。 它也不会删除重复的名称/小时数据。

我本来打算在

array_pop($php_data_array)
上方添加
break;
,但这会引发错误:
Fatal error: Uncaught TypeError: Cannot access offset of type string on string
,我不明白为什么。 (在“if”内添加任何代码都会引发该错误)

while($entries=mysqli_fetch_assoc($get_time_sheets))
{
  $php_data_array[] = $entries; // Adding to array
  foreach($php_data_array as &$value){
        if($value['name'] === $entries['name']){
            $value['hours'] = $value['hours'] + $entries['hours'];
            break; // Stop the loop after we've found the item
        }
    }
}

任何帮助将不胜感激! 我可能在这里忽略了一些简单的东西,只是没有看到它。

php array-merge
1个回答
0
投票

在这里,下面的脚本将 foreach 您的数组并按照您的要求重建它,方法是循环遍历数组并使用名称作为索引构建一个数组,每次遇到相同的名称时,它都会将小时数加在一起,直到循环为止结束。然后它将删除索引并默认返回结果数组的编号索引:

$inputArray = [
    ['name' => 'Hunter', 'hours' => 4.00],
    ['name' => 'Hunter', 'hours' => 4.00],
    ['name' => 'Leon', 'hours' => 8.00],
    ['name' => 'Rowdy', 'hours' => 8.00],
    ['name' => 'Hunter', 'hours' => 8.00],
    ['name' => 'Lonnie', 'hours' => 8.00],
    ['name' => 'Leon', 'hours' => 8.00],
    ['name' => 'Gavin', 'hours' => 8.00],
];

$result = [];

foreach ($inputArray as $entry) {
    $name = $entry['name'];
    $hours = $entry['hours'];

    if (isset($result[$name])) {
        $result[$name]['hours'] += $hours;
    } else {
        $result[$name] = ['name' => $name, 'hours' => $hours];
    }
}

$result = array_values($result);

print_r($result);
© www.soinside.com 2019 - 2024. All rights reserved.