我有一个看起来像这样的数组
$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)
。即它不会从数组中删除最终元素。有什么想法吗?
答案 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)