2012-04-12 5 views
3

У меня есть массив чисел: 16,17,19,19,20. Мне нужно найти недостающее число/пробел (в данном случае это 18/одно число, но это могут быть два числа, например 16,17,20,21), а затем я хочу заполнить пробел таким образом, чтобы остальная часть массив перемещает один (x) номер вверх. Этот массив может иметь больше недостающих чисел (пробел), например. 16,17,19,19,20,21,23,23. У меня есть этот цикл, но есть проблема - см комментарий:найти пробел в массиве чисел и заполнить пробел - петля

<?php 
     $ar = array(16,17,19,19,20); 
       $action = false; 
       $new = array(); 
       $temp = array(); 

     foreach ($ar as $k => $v) { 
       if ($k == 0) 
        { 
         // case 0 - insert first value of var into array - never need to change 
         $new[] = $v; 
        } 
       elseif ($k > 0) 
        { 
         if (end($new) + 1 == $v) 
         { 
         // case 1 - numbers are consequence/no gap - insert into array - no change 
          $new[] = $v; 
         } 

        elseif (end($new) + 1 != $v) 
          { 
           // case 2 - there is a gap: find the size of the gap (1,2,x) and then subtract all next values of array with the gap 
            $gap = $v - end($new) - 1 ; // find value of the gap 
            //echo "<br> gap is: " . $gap; // PROBLEM - gap get increased by every loop but i need to keep gap size static and process rest of the array 
            $action = true; 
              if ($action = true) 
               {  
                 $temp[] = $v - $gap; 
               } 
             } 
          } 
         }        

echo "<br>";    
print_r ($new); 
echo "<br>"; 
print_r ($temp); 

поэтому результат: массив новый нормально

Array ([0] => 16 [1] => 17) 

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

Array ([0] => 18 [1] => 18 [2] => 18) 

его должно быть 18,18,19

Как этот сценарий рассматривается? Спасибо.

+0

Я решил это некоторое время назад, поэтому мне нужно будет обновить мою память. – phpJs

ответ

0

попробуйте это, вы можете сделать любое количество пробелов и последовательностей, а рекурсия найдет размер разрыва и числа сдвига вверх, а затем найдите еще один пробел/пробелы.

<?php 

$ar = array(16,17,17,19,19,20,20,24,24); 

echo '<pre>Initial:<br>'; 

print_r ($ar); 

echo '<br>Fixed:<br>'; 

function find_gaps($array) { 

       $key = 0; 
       $first_half = array(); 
       $gap = 0;     
       $gaps = array(); 
       $action = false; 
       $new = array(); // helper array 
       $second_half = array(); 

    foreach ($array as $k => $v) { 
       if ($k == 0) // first number in line - no need to change 
        { 
         $new[] = $v; 
         $first_half[$k] = $v; 
        } 
       elseif ($k > 0) // next numbers 
        { 
         if (end($new) + 1 == $v) // if first member of array is consequent of helper .. 
          { 
          $new[] = $v;   
          $first_half[$k] = $v; // .. it's ok- just make new array 
          } 
         elseif (end($new) == $v) // if there are two or more same numbers - it's ok .. 
           { 
          $new[] = $v; 
          $first_half[$k] = $v; // .. no action-just keep adding into array 
          } 
        elseif (end($new) + 1 != $v) // if last value of helper array is not 1 less of our array - there is a gap 
           { 
             $gap = $v - end($new) - 1 ; // find size of the gap in numbers (can be 1,2,3..) 
             //echo $gap; break; 
             $gaps[] = $gap; // put gap into array - it will get increased but you need only first value - see if ($action) 
             $action = true; 
           } 
            if ($action) 
              { 
              $second_half[$k] = $v; // make second half array 
              } 
        } 
      } // end array loop then.. 


    $second_half_fixed = array(); 

     foreach ($second_half as $keys => $values) 
          $second_half_fixed[$keys] = $values - $gaps[0]; 

      $a['first'] = $first_half; 
      $a['fixed'] = $second_half_fixed; 
      $b['fixed'] = $first_half + $second_half_fixed; 
      $b['gaps'] = $gaps; 

      $count_gaps = count($b['gaps']); 

      if ($count_gaps == 0 OR $count_gaps == 1){ 
          return $b; 
       } 
      else // more gaps 
        { 
         echo 'run again<br>'; 
          return (find_gaps($b['fixed'])) ;    
        }  
    } // end function 'find_gaps' 

    $fixed = find_gaps($ar); 

    print_r ($fixed['fixed']); 
2

Читает цели и текущий код о заполнении недостающих цифр, я придумал мой собственный код:

http://pastebin.com/58nNGuNB

$ar = array(16,17,19,19,20); 
$action = false; 
$new = array(); 
$temp = array(); 

foreach ($ar as $key => $val) { 
    if($key == 0 OR $ar[$key-1] == $val) { 
     // if it's first value, or current value is same as previous, just add it as is 
     $new[] = $val; 
    } else { 
     // else, add all missing value including current one to $new array 
     for($x = $ar[$key - 1] + 1; $x <= $val; $x++) { 
      $new[] = $x; 
     } 
    } 
} 

Его выход следующим образом:

Array 
(
    [0] => 16 
    [1] => 17 
    [2] => 18 
    [3] => 19 
    [4] => 19 
    [5] => 20 
) 

Просто сказать если я что-то упустил.

+0

ваш результат добавляет одно число, поэтому массив имеет теперь 6 членов, но исходный массив имеет только 5 членов. поэтому ваше решение не подходит в этом сценарии. я выложу функцию (это рекурсия), что я сделал. – phpJs

+0

У меня есть мысль об этом до ... вам нужно удалить любые повторяющиеся значения? – akhyar

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