2017-04-26 40 views
1

我想从数组中找到最小值,并从所有元素中减去该值,直到所有元素都变为0为止。问题是,如果数组包含元素之一作为0,那么它不反映任何东西。提前致谢。如何在php中获得最大正值大于0

<?php 

$handle = fopen ("php://stdin","r"); 
fscanf($handle,"%d",$n); 
$arr_temp = fgets($handle); 
$arr = explode(" ",$arr_temp); 
array_walk($arr,'intval'); 

for($j=0;$j<10;$j++) 
{ 
    $min = min($arr); 
    for($i=0;$i<count($arr);$i++) 
    { 
     if($arr[$i]>=$min) 
      $arr[$i]-=$min; 
     echo $arr[$i]." "; 
    } 
    echo "\n"; 
} 

?> 
+1

告诉我们你的代码 – webpic

+0

忽略0值?如果($ var === 0)继续; ? –

+0

看到这里:http://stackoverflow.com/questions/6748836/min-function-that-ignores-negative-values-in-php –

回答

1

使用array_filter(),再加上功能即使数组包含值为零的元素,你可以得到的最小非零正整数,如下所示:

<?php 

$arr = array(0, 1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0); 

function getMin($a) { 
    $arr_filtered = array_values(array_filter($a)); 
    return min($arr_filtered); 

} 

$min = getMin($arr); 

$count = count($arr); 

while(count(array_unique($arr)) > 1) { 


    for($i = 0; $i < $count; $i++) 
    { 
     if($arr[$i] >= $min){ 
      $arr[$i] -= $min; 
      echo $arr[$i]." "; 
     } 
    } 
echo "\n"; 
} 

请参阅demo

请注意,代码使用array_values()重新为getMin()中的过滤数组编码索引。

只要最小值是一个,上面的脚本就能正常工作。但是,如果最小值是另一个数字,则需要调整代码。下面的脚本处理一个具有不同的最小值四个阵列中,每个构成多维数组,包括一个具有负的值:

<?php 
error_reporting(E_ALL); 

$a = [ [0,1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0], 
     [0, 2, 3, 4, 0, 5, 6, 4, 3, 2, 0], 
     [0, 3, 4, 0, 5, 6, 7,8,4, 3, 0], 
     [-1,0,1,2,3,4,2,1,0,-1] 
    ]; 

function getMin($a) { 

    return min($a); 

} 


foreach ($a as $arr) { 
while(($arr != null) ) { 
    $arr = array_values(array_filter($arr)); 
    if ($arr == null) { 
    break; 
    } 
    $min = getMin($arr); 

    foreach ($arr as &$e) { 
      $e -= $min; 
    } 
    unset($e); 
    echo join(" ",$arr),"\n"; 
} 
echo "\n"; 
} 

看到demo

注意,第二脚本明确地滤掉零值在每个阵列中,而第一个脚本有效地这样做。这两个脚本之间的主要区别在于,getMin()需要位于while循环中,以便在最小数大于1或负数时正确执行减法。

该脚本还通过几种方式简化了代码。 while循环的更简单条件 - 只要数组不为空即可。代码不再需要getCount(),因为我将减法循环改为使用foreach和随后未设置的引用变量 - 这对于避免问题很重要。这个foreach循环也不需要if条件的第一个脚本。

0

我不知道很多关于PHP,但在第一for循环中,您应检查数组的元素,如果他们是零或者是不使用if语句,例如if(arr[j]!=0)

for($j=0;$j<10;$j++) 
{ 
    if($arr[$j]!=$0) 
    $min = min($arr); 
    for($i=0;$i<count($arr);$i++) 
    { 
     if($arr[$i]>=$min) 
      $arr[$i]-=$min; 
     echo $arr[$i]." "; 
    } 
    echo "\n"; 
} 
1

这是因为你采取每个时间的价值,并且它变成0这就是为什么你的代码不工作。 尝试下面的代码

$min = min($arr); 
for($j=0;$j<=100;$j++) 
{ 
if (count(array_unique($arr)) === 1 && end($arr) === 0) { 
break; 
} 
    for($i=0;$i<count($arr);$i++) 
    { 
     if($arr[$i] >= $min){ 
      $arr[$i]-=$min; 
     echo $arr[$i]." "; 
    } 
    } 
echo "<br>"; 
}