使用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條件的第一個腳本。
告訴我們你的代碼 – webpic
忽略0值?如果($ var === 0)繼續; ? –
看到這裏:http://stackoverflow.com/questions/6748836/min-function-that-ignores-negative-values-in-php –