@lazybone

Как добавить данные в те же ключи массива?

Есть массив:

$arr = [['apple', '10', '10', '10'],
        ['apple', '20', '5', '10'],
        ['apple', '15', '5', '10'],
        ['banana', '10', '10', '10'],
        ['orange', '10', '15', '20'], 
        ['orange', '5', '15', '10']];

Надо объединить по первому ключу, при этом, в других ключах должно быть следующее правило:
1) если значения равны, то его и оставляем
2) если второе значение больше/меньше первого, то ставим его сзади/спереди и добавляем тире (т.е. если у нас '10' и '20', то на выходе получим '10-20')
3) если значение находится между крайними цифрами, то промежуток оставляем таким же (если уже '10-20', а значение '15', то так и остается '10-20')
В итоге, массив должен быть таким:

$arr = [['apple', '10-20', '5-10', '10'],
        ['banana', '10', '10', '10'],
        ['orange', '5-10', '15', '10-20']];

Видел похожий вопрос, но там значения добавлялись в конец, а мне необходимы изменения в тех же ключах. Как лучше это сделать? Условия, где будем сравнивать значения, наверное, прописывать в функциях, но как их выбрать/объединить перед этим. Или же можно сделать как-то попроще?
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F
$grouped = array_map(function($n) {
  for ($i = 1; $i < count($n); $i++) {
    $min = min($n[$i]);
    $max = max($n[$i]);
    $n[$i] = ($min === $max) ? $min : "$min-$max";
  }
  return $n;
}, array_values(array_reduce($arr, function($acc, $n) {
  $acc[$n[0]] ??= [ $n[0] ];
  for ($i = 1; $i < count($n); $i++) {
    $acc[$n[0]][$i][] = $n[$i];
  }
  return $acc;
}, [])));
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы