Php 防止值重叠

Php 防止值重叠,php,arrays,algorithm,Php,Arrays,Algorithm,我有以下数组 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 我想防止重叠,我

我有以下数组

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
到目前为止,我已经尝试了以下代码来检测重叠

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;

        }
}
while(列表($i,$v)=每个($data)){
如果(!empty($data[$i+1][“margin”])){

如果($data[$i+1][“margin”]-$v[“margin”])我的建议是通过数组递归:

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>";        
函数f($i)
{
全球$n,$利润;
//检查索引是否超出范围
如果($i<$n)
{
//跳过数组中的第一个边距
如果($i>0)
{
//如果达到30,则停止
如果($margins[$i]['margin']3),
数组('margin'=>7),
数组('margin'=>15),
数组('margin'=>25),
数组('margin'=>30)
);    
var_dump($margins);echo“
”; //初始化$n $n=计数($margins); //调用递归函数 f(1); var_dump($margins);echo“
”;
这是因为边距数组的大小很小,较大的数组将使用内存资源