在迭代数组时使用 unset() 删除空值


Using unset() while iterating over array to remove empty values

尝试像这样从数组中删除空值。每次使用 unset() 时,它都会丢失一个键。我知道可能有更好的方法来完成任务,但我需要知道为什么当前代码缺少一些键?

$values_arr = array(
   0 => "Text",
   1 => "",
   2 => "",
   3 => "Text",
   4 => "",
   5 => "Text"
);

理论上有效

for ($i = 0; $i < count($values_arr); $i++) {
    if ( empty($values_arr[$i]) ) {
        echo "<br> Blank key found " . $i . ", value was >" . $values_arr[$i] . "<";
        //Unset commented out
        //unset($values_arr[$i]);
    }
}
var_dump($values_arr);

输出

Blank key found 1, value was ><
Blank key found 2, value was ><
Blank key found 4, value was ><
array (size=6)
  0 => string 'Text' (length=4)
  1 => string '' (length=0)
  2 => string '' (length=0)
  3 => string 'Text' (length=4)
  4 => string '' (length=0)
  5 => string 'Text' (length=4)

未设置不起作用

for ($i = 0; $i < count($values_arr); $i++) {
    if ( empty($values_arr[$i]) ) {
        echo "<br> Blank key found " . $i . ", value was >" . $values_arr[$i] . "<";
        unset($values_arr[$i]);
    }
}
var_dump($values_arr);

输出

Blank key found 1, value was ><
Blank key found 2, value was ><
array (size=4)
  0 => string 'Text' (length=4)
  3 => string 'Text' (length=4)
  4 => string '' (length=0)
  5 => string 'Text' (length=4)

为什么键 4 没有未设置?

代码的问题在于,当你点击索引4时,它将等于数组的大小,循环停止。

对此有一个单行解决方案:

$values_arr = array_filter($values_arr, 'strlen');

它对每个数组元素执行strlen(),并返回一个包含非空字符串元素的新数组。

另一种方法是找到与空字符串值对应的键,然后在主数组中逐个unset()这些键:

foreach (array_keys($values_arr, '', true) as $key) {
    unset($values_arr[$key]);
}

这应该适合您:

<?php
    $values_arr = array(
                   0 => "Text",
                   1 => "",
                   2 => "",
                   3 => "Text",
                   4 => "",
                   5 => "Text"
                );
    foreach($values_arr as $k => $v) {
        if(empty($v) || $v == "")
            unset($values_arr[$k]);
    }
    print_r($values_arr);
?>

输出:

Array ( [0] => Text [3] => Text [5] => Text )

<>为什么您的版本不起作用?

因为在你的 for 循环中,你有条件:$i < count($values_arr)

因此,每次迭代 for 循环都会检查条件!因此,如果您在数组中取消设置值,计数会变小!取消设置2后,for循环不再达到索引4!