2012-02-27 184 views
2

我有一個PHP數組。php檢查陣列中至少有兩個大於0的值

比方說

$array = array(20,1,0, 0, 0,0,8); 

我需要檢查是否可用大於0陣列中至少拖值。舉個例子。

$array = array(20,1,0, 0, 0,0,8); 
// True - Above array has at least two values which is > 0 

$array = array(0,9,0, 0, 0,0,0); 
// False- Above array doesn't have at least two values which is > 0 

我想知道是否有任何簡單的方法來完成這個沒有循環數組。

謝謝。

+0

你可能意思是「沒有手動循環」整個數組,不是嗎? – 2012-02-27 08:05:32

+0

是的。沒有手動循環。 – 2012-02-27 08:07:25

回答

8

您可以使用array_filter(),以減少您的陣列只非零項目,再算上其中:

$array = array(20, 0, 0, 0, 0, 0, 0); 
$temp = array_filter($array, function($value){ 
    return $value > 0; 
}); 
echo count($temp) >= 2 ? "true" : "false"; 

注:對於不支持匿名函數老版本PHP,你需要單獨創建的功能,並通過它的名字array_filter()功能作爲一個字符串。

0

您可能需要使用array_reduce或類似的

function reducer($accumulator, $elem){ 
    if ($elem>0) 
     $accumulator++; 
    return $accumulator; 
} 

$array = array(9,0,0,0); 
$greater_than_zero = array_reduce($array, 'reducer', 0); 
1

東西沒有循環?好了,你可以

<?php 
$array = array(20,1,0, 0, 0,0,8); 
rsort($array); 
if ($array[0] > 0 && $array[1] > 0) { 
    // yippie 
} else { 
    // oh no! 
} 

但不會有任何好於

<?php 
$array = array(20,1,0, 0, 0,0,8); 
$greaterThanZero = 0; 
foreach ($array as $v) { 
    if ($v > 0) { 
    $greaterThanZero++; 
    if ($greaterThanZero > 1) { 
     $greaterThanZero = true; 
     break; 
    } 
    } 
} 

if ($greaterThanZero === true) { 
    // yippie 
} else { 
    // oh no! 
} 

第一個解決方案可能會稍微更少的代碼,但排序()比的foreach更昂貴的(意爲速度較慢) 。你看,這個foreach可以停止一次,一旦它達到兩個positivie命中。 sort()會對整個數組進行排序。建議array_reduce()的答案也將遍歷整個數組。

以允許「快速退出」的方式設計您的算法。爲什麼當你已經知道答案時繼續處理數據?沒有意義,只會浪費資源。

2

試試這個方法,使用array_filter,它基本上過濾你的元素,那麼你就計,你正在尋找

function positive($var) 
{ 
    // returns whether the input integer positive 
    return($var > 0); 
} 

print_r(array_filter($array, "positive")); 
相關問題