Многомерный массив PHP: объединить по ключу и добавить значения другого ключа

иметь такой массив:

    array (
'@attributes' =>
array (
'status' => 'ok',
),
'time_entries' =>
array (
'@attributes' =>
array (
'page' => '1',
'per_page' => '100',
'pages' => '1',
'total' => '33',
),
'time_entry' =>
array (
0 =>
array (
'time_entry_id' => '1411884',
'staff_id' => '22384',
'project_id' => '11116',
'task_id' => '3296',
'hours' => '1.75',
'date' => '2017-02-20',
'notes' => 'What is Quadra, Events Slider, Event Page Setup',
'billed' => '0',
),
1 =>
array (
'time_entry_id' => '1411254',
'staff_id' => '22384',
'project_id' => '11116',
'task_id' => '3296',
'hours' => '1.5',
'date' => '2017-02-17',
'notes' => 'Events Slider, Background overlay, Intro',
'billed' => '0',
),
2 =>
array (
'time_entry_id' => '1410694',
'staff_id' => '22384',
'project_id' => '11116',
'task_id' => '3296',
'hours' => '2.75',
'date' => '2017-02-16',
'notes' => 'Background Image SVGs, Header, Footer',
'billed' => '0',
),
3 =>
array (
'time_entry_id' => '1410586',
'staff_id' => '22384',
'project_id' => '11116',
'task_id' => '3296',
'hours' => '0.5',
'date' => '2017-02-15',
'notes' => 'Site Background
Assign Less Variables',
'billed' => '0',
),
4 =>
array (
'time_entry_id' => '1409621',
'staff_id' => '22384',
'project_id' => '11116',
'task_id' => '3296',
'hours' => '0.25',
'date' => '2017-02-14',
'notes' => 'Theme Install',
'billed' => '0',
),

…на самом деле все идет дальше, чем в первых 4. Я собираюсь отсортировать эти массивы по ключу [«task_id»], чтобы я мог сгруппировать их вместе, а затем сложить вместе клавишу [«hours»] — так, чтобы в конце я могу вывести общее количество часов, отработанных под каждым task_id.

Я попробовал немного ‘array_merge_recursive’ и аналогичных, но я в растерянности; это PHP немного выше моего уровня. Помощь очень ценится.

1

Решение

Таким образом, вам, вероятно, лучше делать группирование и суммирование, генерируя новый набор данных, а не пытаться модифицировать этот массив.

Нечто подобное даст вам то, что вы ищете:

$time_entries = $your_array["time_entries"]["time_entry"];
$task_hours = [];
foreach ($time_entries as $time_entry) {
if (!isset($task_hours[$time_entry["task_id"]])) {
$task_hours[$time_entry["task_id"]] = 0;
}
$task_hours[$time_entry["task_id"]] += (float) $time_entry["hours"];
}

$task_hours даст вам значение как:

Array
(
[3296] => 5
[1879] => 0.25
)
1

Другие решения

Вместо сортировки массива и последующего суммирования часов, почему бы не обработать соответствующую часть этого массива и не выполнить суммирование за один раз.

$tots = array();
foreach( $array['time_entry'] as $task ) {
if ( isset($tots['task_id']) ) {
$tots['task_id'] += $task['hours'];
} else {
$tots['task_id'] = $task['hours'];
}
}

Теперь у вас должен быть массив, ключом которого является task_id и его значение является суммой всех этих ключей hours,

Если вы хотите task_idв порядке, затем сортировать $tots массив перед выводом любых результатов

ksort($tots);

Если вы хотите результаты в порядке количества часов

asort($tots);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector