【问题标题】:Preventing Overlaps of Values防止值重叠
【发布时间】:2015-09-12 12:32:15
【问题描述】:

我有以下数组

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;

        }
}

但我在做一些算法来消除重叠部分时遇到了困难。

附:数组中的所有数据都已排序(按边距)。

任何人都可以帮助我吗?提前致谢。

【问题讨论】:

    标签: php arrays algorithm


    【解决方案1】:

    我的建议是通过您的数组重复:

    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>";        
    

    这是因为您的边距数组的大小很小,较大的数组会占用内存资源。

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多