Задать вопрос
@Sergo94Min
Разработчик

Какие варианты вы знаете, что бы разбить массив по ближайшим значениям?

Например есть огромный массив, в пару десятков тысяч значений такого вида:
[
31 => 0
32 => 0
33 => 1
34 => 1
35 => 1
36 => 0
37 => 0
38 => 0
39 => 1
40 => 1
41 => 1
41 => 1
43 => 1
44 => 0
45 => 0
46 => 0
]

И нужно его разбить на части таким образом, что бы остались массивы только где значение = 0 (и собрались как отдельный массив если они рядом стоящие),
Пример:
$arr = [
1 => [
     31 => 0,
     32 => 0,
  ],
2 => [
     36 => 0,
     37 => 0,
     38 => 0,
  ],
3 => [
     44 => 0,
     45 => 0,
     46 => 0,
  ],
]
  • Вопрос задан
  • 124 просмотра
Подписаться 2 Средний 8 комментариев
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
https://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D...

у тебя состояния.
1) начальное
2) текущий интервал

сигналы входные - цикл по твоему массиву
используется значение и текущий индекс

графы переходов.
из начального состояния(1) в (2) запомнить S
если в состоянии (2) найден конец интервала, то добавить в массив результатов и перейти в состояние (1)

в остальных случаях реакций нет.

ну и аккуратнее на первом и последнем элементе.
Если после цикла состояние (2), то закрываешь интервал последним индексом
Ответ написан
Если интересна реализация в коде, то вот так вроде работает:
$grouped = array_reduce(array_keys($array), function($result, $value) use ($array) {
    if ($array[$value] == 0) {
        if (count($result)) {
            $max_key = max(array_keys($result));
            $max_value = max($result[$max_key]);

            if ($value - $max_value == 1) {
                $result[$max_key][] = $value;
            } else {
                $result[$max_key + 1] = [$value];
            }
        } else {
            $result[1] = [$value];
        }
    }

    return $result;
}, []);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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