@VladBokov

Какая логика создания новых массивов из уже соществующего путем перебора в цикле?

Приветствую! Сориентируйте пожалуйста по логике, чет я в тупике.
У меня есть массив :
Array ( [0] => 863|20 [1] => 863|50 [2] => 822|100 [3] => 822|100 )


В foreach я с помощью explode получаю два значения из строки путем ее разбиения после символа | .
Как сделать так, чтобы в итерациях перебора массива, я мог создать новые массивы $new_arr[] которые бы наполнялись только теми значениями из итерации, если нулевой индекс массива explode был равен аналогичному в первом массиве.
Например. У меня есть две строки в массиве со значениями. которые начинаются на 863. Мне нужно чтобы в foreach создавались новые массивы, но отсортированные по 863.
$new_arr_863 = array([0] => 863|20 [1] => 863|50);
$new_arr_822 = array([0] => 822|100 [1] => 822|100);


Это все нужно для того, чтобы далее получить сумму значений второй подстроки из explode в каждом массиве. Так получится:
Массив 863 будет иметь значение с суммой 70
Массив 822 = 200.
  • Вопрос задан
  • 52 просмотра
Решения вопроса 2
@IS-Builder
~ PHP-8 & REGEXP - This is a really powerful kit ~
VladBokov
$arr = [
    '863|20',
    '863|50',
    '822|100',
    '822|100'
];

$out = [];

foreach ($arr as $item) {
    [$k, $v] = explode('|', $item);
    $out[$k][] = $v;
}

var_dump($out);

Результат
array (size=2)
  863 => 
    array (size=2)
      0 => string '20' (length=2)
      1 => string '50' (length=2)
  822 => 
    array (size=2)
      0 => string '100' (length=3)
      1 => string '100' (length=3)

UPD:
Дополнил ответ суммированием
$arr = [
    '863|20',
    '863|50',
    '822|100',
    '822|100'
];

$out = [];

foreach ($arr as $item) {
    [$k, $v] = explode('|', $item);
    $out[$k] = ($out[$k] ?? 0) + $v;
}

var_dump($out);
/* 
array (size=2)
  863 => int 70
  822 => int 200
*/
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$arr = ['863|20', '863|50', '822|100', '822|100'];
$result = array_reduce(
  $arr,
  function ($carry, $item) {
    $els = explode('|', $item);
    $carry[+$els[0]] = ($carry[+$els[0]] ?? 0) + $els[1];
    return $carry;
  },
  []
);
print_r($result);
// Array (
//     [863] => 70
//     [822] => 200
// )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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