-1

私はこのような配列を持っています

 $hours_worked = array('23',0,'24',0)

実行したいのは、配列をループして、0を含む要素を削除することです。

私がこれまでに持っているのは:

for($i = 0; $i < count($hours_worked); $i++) 
{
   if($hours_worked[$i] === 0 )
   {
       unset($hours_worked[$i]);
   }    
}

しかし、私が得る結果はです$hours_worked = array(23,24,0)。つまり、配列から最後の要素を削除しません。何か案は?

4

2 に答える 2

0

このコードの問題は、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ます。つまり、文字列表現が同じ場合です。

于 2013-03-13T21:26:08.120 に答える
-1

代わりに foreach ループを試してください

$new_array = array();
foreach($hours_worked as $hour) {
   if($hour != '0') {
      $new_array[] = $hour;
   }
}
// $new_array should contain array(23, 24)
于 2013-03-13T21:21:49.557 に答える