@Soffeso

Как объединить данные в двумерном массиве?

Имеется массив:

$arr = [
    ['Саша', '100', '200', '300'],
    ['Петя', '100', '100', '100'],
    ['Настя', '200', '100', '50'], 
    ['Настя', '150', '150', '150'],
    ['Саша', '50', '100', '150'],
    ['Саша', '200', '200', '200'],
];

Необходимо исключить повторения имён, а остальные данные объединить.
В итоге должно получиться так:

$arr = [
    ['Настя', '150, 200', '150, 100', '150, 50'],
    ['Петя', '100', '100', '100'],
    ['Саша', '50, 100, 200', '100, 200, 200', '150, 300, 200'],
];

Мое решение состоит в том, что я сначала создаю новый массив и заполняю его имеющимися данными, затем сортирую его и объединяю. Проблема состоит в последнем. Я пытаюсь делать через циклы и условия, но теряются данные (понимаю, что из-за for и того, что заново индексируем массив). Возможно, правильнее было бы использовать while, вместо if, но тогда появляется ошибка о не найденном ключе в массиве.

Код

$merge_array = $this->createArray($arr);
for($i = 0; $i < count($merge_array) - 1; $i++) {
    if($merge_array[$i][0] == $merge_array[$i+1][0]) {
        $merge_array[$i][0] = $merge_array[$i+1][0];
        for($k = 1; $k < count($merge_array[$i]); $k++) {
            $merge_array[$i][$k] = $merge_array[$i][$k] . ', ' . $merge_array[$i+1][$k];
        }
        unset($merge_array[$i+1]);
        $merge_array = array_values($merge_array);
    }
}
return $merge_array;


Как быть?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
0xD34F
@0xD34F
$grouped = array_values(array_reduce($arr, function($acc, $n) {
  $acc[$n[0]] ??= [ $n[0] ];
  array_push($acc[$n[0]], ...array_slice($n, 1));
  return $acc;
}, []));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы