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

Ниже приведен один массив, состоящий из дочерних массивов. Каждый ребенок представляет собой набор результатов в базе данных
для конкретного события, и они сгруппированы по тому, используя [event_id] поле. я бы хотел
суммируйте баллы для клиентов, а затем, как только это будет сделано, просмотрите массив и добавьте новый элемент
называется [point_total] каждому дочернему массиву. Соответствующие массивы на основе [customer_id] их точки будут суммированы, а затем добавлены к каждому массиву, содержащему этот идентификатор клиента. Я не уверен, что это возможно сделать все за один раз или мне нужно запустить массив через второй раз после подсчета точек, чтобы добавить поле total_points для клиентов.

Состав:

[0] => Array
(
[0] => Array
(
[customer_id] => 962
[event_id] => 1
[score] => 356
[point] => 1
)

[1] => Array
(
[customer_id] => 962
[event_id] => 1
[score] => 356
[point] => 1
)
)
[1] => Array
(
[0] => Array
(
[customer_id] => 962
[event_id] => 2
[score] => 356
[point] => 1
)

[1] => Array
(
[customer_id] => 962
[event_id] => 2
[score] => 356
[point] => 1
)
}
[2] => Array
(
[0] => Array
(
[customer_id] => 962
[event_id] => 3
[score] => 356
[point] => 1
)

[1] => Array
(
[customer_id] => 962
[event_id] => 3
[score] => 356
[point] => 1
)
}

-3

Решение

Вам понадобится пара вложенных циклов foreach и временный массив:

$temp=array();
foreach($data as $element)
foreach($element as $child)
$temp[$child['customer_id']] = isset($temp[$child['customer_id']])?$temp[$child['customer_id']]+$child['score']:$child['score'];

foreach($data as &$element)
foreach($element as &$child)
$child['total']=$temp[$child['customer_id']];

Живой пример: http://codepad.viper-7.com/HkNF67

Заметка это основывалось на том, что вы хотите суммировать баллы, если вы хотите суммировать баллы, вы можете просто заменить $child['score'] за $child['point']

0

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

Вам понадобится два шага: сначала пройдитесь по массиву и рассчитайте общее количество очков за customer_id, Затем пройдитесь по нему снова и прикрепите total_point каждому клиенту:

// Step 1

function reduce_points_total($carry, $item) {
if (is_array($item)) {
if (isset($item['customer_id']) && isset($item['point'])) {
if (!isset($carry[$item['customer_id']])) $carry[$item['customer_id']] = 0;
$carry[$item['customer_id']] += $item['point'];
} else {
$carry = array_reduce($item, reduce_points_total, $carry);
}
}
return $carry;
}

$points_total = array_reduce($array, reduce_points_total, array());

// Step 2

function insert_points_total(&$item, $key, $points_total) {
if (is_array($item)) {
if (isset($item['customer_id']) && isset($points_total[$item['customer_id']])) {
$item['points_total'] = $points_total[$item['customer_id']];
} else {
array_walk($item, insert_points_total, $points_total);
}
}
}

array_walk($array, insert_points_total, $points_total);

Рекурсивный array_reduce на шаге 1 вычисляется $points_totale, Он генерирует массив:

Array
(
[962] => 4
[963] => 3
)

Рекурсивный array_walk() на шаге 2 вставляет эти цифры в основной $array,

Здесь вы найдете демо-версию: https://eval.in/200799

0

По вопросам рекламы [email protected]