Добавить в массив последовательные номера - PullRequest
2 голосов
/ 16 ноября 2010

Это мой первый вопрос к SO, я надеюсь, что это правильно. В PHP (если вы не можете, с Python или псевдо-языком тоже все в порядке), учитывая массив из n элементов:

old_array = [1, 2, 3, 5, 7, 8, 9, 20, 21, 23, 29]

Мне нужно добавить в новый массив последовательные числа, если это не последовательный номер, добавить только это значение в новый массив:

new_array = [ [1,2,3],
              [5],
              [7,8,9]
              [20,21]
              [23],
              [29]
            ]

Здесь, на SO, я нашел эти связанные темы, но не могу заставить его работать.

  1. Создание списка списков с последовательными номерами
  2. Python находит n последовательных чисел в списке
  3. Найти сумму последовательных целых чисел без использования цикла в JavaScript

Код, который не работал, находится в истории версий, я удалил его, потому что у него проблемы с форматированием.

Спасибо всем, и особенно Хуану, Мизбеллу и Акссуулу за предоставленный правильный ответ.

Ответы [ 3 ]

4 голосов
/ 16 ноября 2010

Лучшее, что я могу придумать, это:

function subsequenceArray($values) {
    $res = array();
    $length = count($values);
    if (0 == $length) {
        return $res;
    }
    $last = 0;
    $res[$last] = array($values[0]);
    for ($i = 1; $i < $length; $i++) {
        if ($values[$i] == $values[$i-1] + 1) {
            $res[$last][] = $values[$i];
        } else {
            $res[++$last] = array($values[$i]);
        }
    }
    return $res;
}
1 голос
/ 16 ноября 2010

Попробуйте это

function buildPairedArray($oldArray) {
$newArray = array();
$i = 0;

foreach ($oldArray as $index => $value) {
    if ($index == 0) {
        $newArray[$i][] = $value;
        continue;

    }

    if ($oldArray[$index] == $oldArray[$index-1]+1) { // consecutive
        $newArray[$i][] = $value;

    } else {
        $newArray[++$i][] = $value;

    }
}

return $newArray;

}

Тестирование

$old = array(1, 2, 3, 5, 7, 8, 9, 20, 21, 23, 29);
print_r(buildPairedArray($old));

Результаты:

Массив ( [0] => Массив ( [0] => 1 [1] => 2 [2] => 3 )

[1] => Array
    (
        [0] => 5
    )

[2] => Array
    (
        [0] => 7
        [1] => 8
        [2] => 9
    )

[3] => Array
    (
        [0] => 20
        [1] => 21
    )

[4] => Array
    (
        [0] => 23
    )

[5] => Array
    (
        [0] => 29
    )

)

0 голосов
/ 16 ноября 2010

Согласен, мне кажется, что это стандартный вопрос разработки алгоритма. Eagleal, вы пытались продумать псевдо-код для этого, а затем преобразовать его в PHP? Как бы вы сказали математически (в своей голове), если два числа являются последовательными? Подсказка: ответ включает в себя вычитание или даже сложение и число 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...