在php中从数组中删除元素

时间:2013-03-13 21:18:15

标签: php arrays loops

我有一个看起来像这样的数组

 $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)。即它不会从数组中删除最终元素。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

此代码的问题在于您在每次迭代时计算count($hours_worked);删除项目后,计数将减少,这意味着对于删除的每个项目,循环将在数组末尾看到一个项目之前终止。因此,解决它的一个直接方法是将计数从循环中拉出来:

$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如何比较项目:

  

当且仅当(string) $elem1 === (string) $elem2时,才认为两个元素相等。用词:当字符串表示是   相同。

答案 1 :(得分:-1)

尝试使用foreach循环

$new_array = array();
foreach($hours_worked as $hour) {
   if($hour != '0') {
      $new_array[] = $hour;
   }
}
// $new_array should contain array(23, 24)