2010-06-24 2 views
0

У меня есть массив, который использует временные метки UNIX для ключей массива. Массив, как правило, хранит данные в течение от 15 минут до часа времени, однако есть только записи за секунды, у которых есть данные.Найдите самый длинный диапазон последовательных ключей Array

Большая часть данных будет разбросана, иногда будут промежутки данных за последовательные секунды. То, что я хотел бы сделать, - получить первую и последнюю секунду самого длинного последовательного промежутка секунд в массиве.

Если у меня есть этот массив

Array 
(
    [1276033307] => 119.0 
    [1276033331] => 281.8 
    [1276033425] => 28.2 
    [1276033431] => 88.2 
    [1276033432] => 196.2 
    [1276034207] => 205.5 
    [1276034226] => 73.8 
    [1276034227] => 75.8 
    [1276034228] => 77.8 
    [1276034230] => 79.8 
) 

я либо нужны ключи 1276034226 и 1276034228, или следующий массив возвращаемые.

Array 
(
    [1276034226] => 73.8 
    [1276034227] => 75.8 
    [1276034228] => 77.8 
) 

ответ

1

Этот код делает это в одном цикле (т.е. является жадный алгоритм):

$array = array(
    1276033307 => 119.0, 
    1276033331 => 281.8, 
    1276033425 => 28.2, 
    1276033431 => 88.2, 
    1276033432 => 196.2, 
    1276034207 => 205.5, 
    1276034226 => 73.8, 
    1276034227 => 75.8, 
    1276034228 => 77.8, 
    1276034230 => 79.8, 
); 

$long_arr = array(); 
$curr_arr = array(); 
$last_key = -1; 

foreach($array as $k => $v) { 
    if ($k != $last_key + 1) { 
     $curr_arr = array(); 
    } 
    $curr_arr[$k] = $v; 
    if (count($curr_arr) > count($long_arr)) { 
     $long_arr = $curr_arr; 
    } 
    $last_key = $k; 
} 

print_r($long_arr); 
2

EDIT:

$array = array(
    1276033307 => 119.0, 
    1276033331 => 281.8, 
    1276033425 => 28.2, 
    1276033431 => 88.2, 
    1276033432 => 196.2, 
    1276034207 => 205.5, 
    1276034226 => 73.8, 
    1276034227 => 75.8, 
    1276034228 => 77.8, 
    1276034230 => 79.8, 
); 

$finalArray = array(); 
foreach($array as $k => $v){ 
    $tempArrays = array(); 
    $index = 0; 
    while(isset($array[$k + $index])){ 
     $tempArrays[$k+$index] = $array[$k+$index++]; 
    } 

    if(count($tempArrays) > count($finalArray)) 
     $finalArray = $tempArrays; 
} 

print_r($finalArray); 

выходной же ...

ORIGINAL:

Примечание: Только первое появление самого длинного пролета будет записано.

$array = array(
    1276033307 => 119.0, 
    1276033331 => 281.8, 
    1276033425 => 28.2, 
    1276033431 => 88.2, 
    1276033432 => 196.2, 
    1276034207 => 205.5, 
    1276034226 => 73.8, 
    1276034227 => 75.8, 
    1276034228 => 77.8, 
    1276034230 => 79.8, 
); 

$longspan = 0; 
foreach($array as $k => $v){ 
    $index = 1; 
    while(isset($array[$k+$index])){ 
     $index++; 
    } 

    $curspan = --$index; 

    if($curspan > $longspan){ 
     $longspan = $curspan; 
     $start = $k; 
    } 
} 

for($i=0; $i <= $longspan; $i++) 
    $results[$start + $i] = $array[$start + $i]; 

print_r($results); 

Выходы:

Array ( 
    [1276034226] => 73.8 
    [1276034227] => 75.8 
    [1276034228] => 77.8 
) 
+1

если изменить ваш ответ немного и использовать массив удерживайте значения внутри isset (что-то вроде while (isset ($ array [$ k + $ index])) {$ tempArr [$ counter] [] = $ array [$ k + $ index];}), а затем проверьте длины sub-массивы, я думаю, вы можете сделать намного больше. Дайте мне знать, если это кажется загадочным. Чувствуя себя слишком ленивым .. – pinaki

+0

Конечно, вам нужно было бы определить и использовать счетчик $ .... – pinaki

+0

спасибо pinaki;) отредактирован соответственно, я думаю ... не уверен, что я прав: -p если нет, по крайней мере, вы сделали я смотрю на это с другой точки зрения. :-) – acm

Смежные вопросы