2017-04-26 39 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>"; 
}