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

  • Автор темы Автор темы bora
  • Дата начала Дата начала

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
        )

)

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

-~{}~ 26.09.05 23:53:

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

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

Просто привел пример на простых цифрах..
 
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])
     );
?>
 
Спасибо конечно но мне нужно чтобы система сама нашла эти последовательности…
 
Вот я думаю по последовательности… я в математике не очень точнее совсем туго.. но мне кажется что это можно сделать.

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

По идеи так но как это все выразить в пхп недогоняю…
 
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
 
Смысл в том, чтобы проверять разность между первым элементом и текущим и количеством элементов всего.
Т.е.
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>";
?>
 
А надо оно для обработки последовательных IP адресов в соответственные диапазоны…
а не проще и удобнее тогда будет находить именно диапазоны?
в данном случае, что-то вроде array (13=>3, ... ) или array(13=>15, ... ) ?
 
Как вариант:
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);
 
Большое всем спасибо… теперь буду подгонять сие под CIDR
 
Сверху