このコードの問題は、count($hours_worked)
反復ごとに計算していることです。アイテムを削除すると、カウントが減少します。つまり、アイテムが削除されるたびに、配列の最後にあるアイテムが 1 つ表示される前にループが終了します。したがって、それを修正するための即時の方法は、カウントをループから引き出すことです。
$count = count($hours_worked);
for($i = 0; $i < $count; $i++) {
// ...
}
とはいえ、コードはさらに改善することができます。foreach
--の代わりに常に使用する必要があるものについてfor
は、これにより、数値的にインデックス付けされた配列だけでなく、すべての配列でコードが機能し、カウントの問題も発生しなくなります。
foreach ($hours_worked as $key => $value) {
if ($value === 0) unset($hours_worked[$key]);
}
array_diff
簡単なワンライナーなので、この種の作業にも使用できます。
$hours_worked = array('23',0,'24',0);
$hours_worked = array_diff($hours_worked, array(0)); // removes the zeroes
これを行う場合は、 がarray_diff
アイテムを比較する方法に注意してください。
の場合にのみ、2 つの要素が等しいと見なされ(string) $elem1 ===
(string) $elem2
ます。つまり、文字列表現が同じ場合です。