У меня есть неупорядоченный массив чисел:
$ar1 = [101,4,320,1,2,3,45,46];
и я хочу извлечь самую длинную последовательность чисел в этом массиве и поместить их во второй массив? Я попытался с usort и я получаю это:
Array( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 45 [5] => 46 [6] => 101 [7] => 320 [8] => 321 [9] => 323)
но как извлечь только самую длинную последовательность (ведь в этом случае 1,2,3,4) и положить в другой массив?
UPDATE: Вот код:
function sub($a,$b) { if ($a == $b) { return 0; } return ($a<$b)? -1:1; } $ar1 = ["101","4","320","321","323","1","3","2","45","46"]; $ar2 = []; usort($ar1,"sub"); print_r($ar1);
поэтому я хочу заполнить $ ar2 с самой длинной последовательностью в массиве …
Я понял:
$ar1 = [101,4,320,1,2,3,45,46,47]; sort($ar1); $first = $ar1[0];//assign first (lowest) number $i=0; $ar2 = array(); //this array will contain all arrays of consecutive numbers foreach($ar1 as $v){ if($v-$first == 1){ $ar2[$i][] = $v; }else{ $i++; $ar2[$i] = array($v); //difference > 1, we set another array } $first = $v; } //now we look for the longest array $max = 0; $longest = array(); foreach($ar2 as $k=>$ar){ $c = count($ar); if($c < $max){ unset($ar2[$k]); //if it is not the longest, we discard it }else{ $max = $c; $longest = $ar; } } echo"<pre>"; print_r($longest); echo"</pre>";
с$ar1 = [101,4,320,1,2,3,45,46,47]; sort($ar1); $first = $ar1[0];//assign first (lowest) number $i=0; $ar2 = array(); //this array will contain all arrays of consecutive numbers foreach($ar1 as $v){ if($v-$first == 1){ $ar2[$i][] = $v; }else{ $i++; $ar2[$i] = array($v); //difference > 1, we set another array } $first = $v; } //now we look for the longest array $max = 0; $longest = array(); foreach($ar2 as $k=>$ar){ $c = count($ar); if($c < $max){ unset($ar2[$k]); //if it is not the longest, we discard it }else{ $max = $c; $longest = $ar; } } echo"<pre>"; print_r($longest); echo"</pre>";
Урожайность:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
Скопируйте, вставьте, запустите, наслаждайтесь!