2010-11-15 2 views
2

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

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. Creating a list of lists with consecutive numbers
  2. Python finding n consecutive numbers in a list
  3. Find the sum of consecutive whole numbers w/o using loop in JavaScript

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

Спасибо всем, и особенно Хуан, mistabell и Axsuul за правильный ответ.

+6

Это настоящая проблема? Это похоже на домашнюю работу. –

+0

Не можете заставить его работать, как вы говорите? Покажите нам, что вы придумали, и, возможно, мы сможем обнаружить проблему. – webbiedave

+0

@Marcelo Cantos Да. В основном я пытаюсь установить webapp, но я застрял в этой проблеме (я разработчик пользовательского интерфейса, и я только начинаю программировать). – eagleal

ответ

4

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

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; 
} 
+0

Также работает версия mistabell. Благодарю. – eagleal

0

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

+0

Да, определенно. Я тоже попытался это проиллюстрировать. – eagleal

1

Тест

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

Что такое ярлык снова для массового кода отступа? ; p – axsuul

+0

У меня тоже проблемы с форматированием. Я пробовал с тегом HTML html, но он не работает. – eagleal