2015-09-12 3 views
2

Я следующий массивПредотвращение перекрытий значений

array (size=5) 
0 => 
array (size=1) 
    'margin' => 1 
1 => 
array (size=1) 
    'margin' => 14 
2 => 
array (size=1) 
    'margin' => 23 
3 => 
array (size=1) 
    'margin' => 24 
4 => 
array (size=1) 
    'margin' => 27 

Я хочу, чтобы предотвратить перекрытие, я означает каждый из них должен быть по крайней мере, отличается от значения/интервала 5, и в то же время я не хотим окончательные маржи макс, чем 30

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

array (size=5) 
0 => 
array (size=1) 
    'margin' => 1 
1 => 
array (size=1) 
    'margin' => 14 
2 => 
array (size=1) 
    'margin' => 19 
3 => 
array (size=1) 
    'margin' => 24 
4 => 
array (size=1) 
    'margin' => 29 

до сих пор, я попробовал FO llowing code для обнаружения перекрытий

while(list($i, $v) = each($data)) { 

    if(!empty($data[$i+1]["margin"])){ 

     if(($data[$i+1]["margin"]-$v["margin"])<5) 
      echo "Overlapping index : ".($i+1).PHP_EOL; 

     } 
} 

, но у меня возникли трудности с выполнением некоторого алгоритма для устранения перекрытий на месте.

P.S. все данные в массиве сортируются (маргинальные значения).

Может ли кто-нибудь мне помочь? Заранее спасибо.

ответ

0

Мое предложение заключается в рецидивирует через массив:

function f($i) 
{ 
    global $n, $margins; 
    // check if index is not out of range 
    if ($i < $n) 
    { 
     // skip first margin in array 
     if ($i>0) 
     { 
      // stop if 30 is reached 
      if ($margins[$i]['margin'] <= 30) 
      { 
       // ajust margin if smaller than 5 
       if (($margins[$i]['margin'] - $margins[$i-1]['margin']) < 5) 
        $margins[$i]['margin'] = $margins[$i-1]['margin'] + 5; 
       // recurs to the next item in the array 
       f($i+1); 
      } 
      else 
       unset($margins[$i]); 
     } 
     else 
      f($i+1); 
    } 
} 

// initialize $margin 
$margins = array(
      array('margin'=>3), 
      array('margin'=>7), 
      array('margin'=>15), 
      array('margin'=>25), 
      array('margin'=>30) 
     );  

var_dump($margins); echo "</br>";  

// initialize $n 
$n = count($margins); 

// Call recursive function 
f(1); 

var_dump($margins); echo "</br>";   

Это происходит потому, что размер вашего массива маржи мал, больше массива будет использовать ресурсы памяти.

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