我在这里发表的第一篇文章,尽管多年来我一直在从你们那里收集知识。 我正在尝试合并以下名称匹配的数组,但我需要将小时数添加在一起。
我尝试的一切都会给出疯狂的结果或给出我无法找到答案的错误。
数组示例:
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
}
}
}
任何帮助将不胜感激! 我可能在这里忽略了一些简单的东西,只是没有看到它。
在这里,下面的脚本将 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);