LINUX.ORG.RU

[php][array] как вычислить не достающие елементы массива

 ,


0

0

есть массив

array(6) {
  [0]=>
  int(8461)
  [1]=>
  int(8462)
  [2]=>
  int(8463)
  [3]=>
  int(8465)
  [4]=>
  int(8467)
  [5]=>
  int(8470)
}
как видно в нем не достает чисел 8464,8466,8468,8469

также известно стартовое число 8660, но оно также может быть меньше, например 8655

массив отсортирован по порядку...

туплю, не могу додуматься как вычислить эти цифры...

массив может быть очень большим )

★★

Последнее исправление: kam (всего исправлений: 1)

режим граммар-наци

простите, кого они не достают ети елементы? в данном случае надо писать вместе «недостающие».

простите, по глазам резануло.

Ingwar ★★★★★
()
Ответ на: режим граммар-наци от Ingwar

Простой вариант: циклом с известного начального элемента до конечного элемента массива (т.к. массив отсортирован).

Megamozg
()
Ответ на: комментарий от kam

решено

web kam # cat test.php
#!/usr/bin/php
<?php
$start=554;
$arr=array(555,556,557,559,562,563,565);
$count=count($arr);
$count--;
$max=$arr[$count];

while($start < $max){
$start++;
    if(!in_array($start,$arr)){
     echo($start."\r\n");
    }
}

?>web kam ./test.php
558
560
561
564
web kam #
kam ★★
() автор топика
Ответ на: комментарий от kam

$count=count($arr);
$count--;
$max=$arr[$count];

Это сейчас так записывают $max = $arr[count($arr)-1]? :)

$start=554;
$arr=array(555,556,557,559,562,563,565);

А так - $start = $arr[0]-1? :D

while($start < $max){
$start++;

А это - даже на Си будет писаться как for(;$start<$max;$start++)

...

Наконец, есть min и max, с которыми массив даже сортирован быть не обязан:

<?php 
$arr=array(555,556,557,559,562,563,565); 

for($i = min($arr), $max = max($arr); $i<$max; $i++)
    if(!in_array($i, $arr))
        echo($i."\r\n");

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

да я уже сам сократил это )) но по другому

<?php
$start=552;
$arr=array(555,556,557,559,562,563,565);
$max=$arr[round(count($arr) - 1)];
for($start=round($start + 1);$start < $max; $start++)
{
    if(!in_array($start,$arr)){echo($start."\r\n");}
}

?>

это, как у тебя for($i = min($arr), $max = max($arr); $i<$max; $i++) не вариант, ибо стартовое значение (min($arr)) может быть не минимальным в массиве, а другим, например еще меньше )

kam ★★
() автор топика
Ответ на: комментарий от kam
<?php
$s = $start = 52;
$arr = range(555, 15780);
$arr = array_diff($arr, array_rand(array_flip($arr), 10000));
$arr = array_values($arr); // reindex
$fast = $slow = array();

$time = microtime(true);
$max=$arr[round(count($arr) - 1)]; // зачем тебе round?
for($start=round($start + 1);$start < $max; $start++)
{
    if(!in_array($start,$arr)){$slow[]=$start;}
}
echo 'slow: '.(microtime(true) - $time)."\n";

$time = microtime(true);
// slow вариант работает и на не отсортированных массивах,
// так что раскомментировать след. строку, если нужно.
// sort($arr); 
$missed = $s + 1; // добавить round по вкусу
for ($i = 0, $len = count($arr); $i < $len; $i++) {
    while ($missed < $arr[$i]) {
        $fast[] = $missed++;
    }
    $missed++;
}
echo 'fast: '.(microtime(true) - $time)."\n";

// make sure the results are the same
$diff = array_merge(array_diff($slow, $fast), array_diff($fast, $slow));
echo count($diff);
?>
anonymous
()
Ответ на: комментарий от anonymous

Бенчить влом, но такой вариант может быть быстрее:

<?php

$start=554;.
$arr=array(555,556,557,559,562,563,565);.

$result = array_diff(range($start, $arr[round(count($arr) - 1)]), $arr);

print_r($result);
KRoN73 ★★★★★
()

Prelude> let lst = [1,3,6,7,8,11]
Prelude> foldr1 (++) $ zipWith (\x y -> tail [x..y - 1]) lst (tail lst)
[2,4,5,9,10]

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.