Выборка последовательностей в массиве…?

bora

Guest
Выборка последовательностей в массиве…?

Например, есть массив с числами:

Код:
Array
(
    [0] => 0
    [1] => 2
    [2] => 4
    [3] => 7
    [4] => 11
    [5] => 13
    [6] => 14
    [7] => 15
    [8] => 20
    [9] => 21
    [10] => 23
    [11] => 33
    [12] => 59
    [13] => 67
    [14] => 90
    [15] => 91
    [16] => 92
    [17] => 93
    [18] => 95
)
Мне нужно чтобы было так:

Код:
Array
(
    [0] => Array
        (
            [0] => 13
            [1] => 14
            [2] => 15
        )

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

    [2] => Array
        (
            [0] => 90
            [1] => 91
            [2] => 92
            [3] => 93
        )

)
Как это собственно можно реализовать……
 

Фанат

oncle terrible
Команда форума
для начала ты должен формализовать свою задачу помощью чётких правил.
поскольку картинку свою на пальцах ты можешь показать нам, но не пэхапе.

-~{}~ 26.09.05 23:53:

Да, и расскажи, по традиции, зачем тебе это вообще понадобилось
 

bora

Guest
Ну не знаю как еще четче можно это выразить... по-моему проблема ясна.

А надо оно для обработки последовательных IP адресов в соответственные диапазоны…

Просто привел пример на простых цифрах..
 

itprog

Cruftsman
PHP:
<?php
$arr = array(0,2,4,7,11,13,14,15,20,21,23,33,59,67,90,91,92,93,95);
$new_arr = array(
     array($arr[5],$arr[6],$arr[7]),
     array($arr[8],$arr[9]),
     array($arr[14],$arr[15],$arr[16],$arr[17])
     );
?>
 

bora

Guest
Спасибо конечно но мне нужно чтобы система сама нашла эти последовательности…
 

bora

Guest
Вот я думаю по последовательности… я в математике не очень точнее совсем туго.. но мне кажется что это можно сделать.

Например берем первое число из массива потом ищем егоже плюс один… если находим создаем новый массив добавляем два значения и ищем дальше с последним найденным плюс один и так пока все не переберем…

По идеи так но как это все выразить в пхп недогоняю…
 

Profic

just Profic (PHP5 BetaTeam)
PHP:
<?php
$arr = $arrSave = array(0,2,4,7,11,13,14,15,20,21,23,33,59,67,90,91,92,93,95);

$arrNew = array();
$arrChunk = array();
$item = array_shift($arr);
do {
	if (count($arr) && $item + 1 == $arr[0]) {
		$arrChunk[] = $item;
	} else {
		if (count($arrChunk)) {
			$arrChunk[] = $item;
			$arrNew[] = $arrChunk;
			$arrChunk = array();
		}
	}
} while (($item = array_shift($arr)) !== false);

print_r($arrSave);
print_r($arrNew);

?>
:D
 

ForJest

- свежая кровь
Смысл в том, чтобы проверять разность между первым элементом и текущим и количеством элементов всего.
Т.е.
93-90 = 3. Если элементов уже 90 и 91, 92 то это будет <=. Если же есть "дырка" то будет >.
PHP:
<?php
$array = array
(
    0 => 0,
    1 => 2,
    2 => 4,
    3 => 7,
    4 => 11,
    5 => 13,
    6 => 14,
    7 => 15,
    8 => 20,
    9 => 21,
    10 => 23,
    11 => 33,
    12 => 59,
    13 => 67,
    14 => 90,
    15 => 91,
    16 => 92,
    17 => 93,
    18 => 95,
);
$result = array();
$tmp = array();
foreach ($array as $value)
{
     //echo $value, '<pre>', var_dump($tmp,1), '</pre>, ';
     if ($value - reset($tmp) <= count($tmp))
     {
          $tmp[] = $value;
          continue;
     }
     if (count($tmp) > 1)
     {
          $result[]=$tmp;
     }
     $tmp = array($value);
}
echo "<pre>",var_export($result,1),"</pre>";
?>
 

jdoe

Новичок
А надо оно для обработки последовательных IP адресов в соответственные диапазоны…
а не проще и удобнее тогда будет находить именно диапазоны?
в данном случае, что-то вроде array (13=>3, ... ) или array(13=>15, ... ) ?
 

SelenIT

IT-лунатик :)
Как вариант:
PHP:
$arr = array(0,2,4,7,11,13,14,15,20,21,23,33,59,67,90,91,92,93,95);

for ($i=0, $j=0, $cnt=count($arr), $new_arr = array(); $i<$cnt; $i++) {
   if ($i<$cnt-1 && $arr[$i]+1==$arr[$i+1]) $new_arr[$j][] = $arr[$i];
   elseif (isset($new_arr[$j])) $new_arr[$j++][] = $arr[$i];
}

print_r($new_arr);
 

bora

Guest
Большое всем спасибо… теперь буду подгонять сие под CIDR
 
Сверху