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

时间:2014-11-21 04:03:55

标签: php arrays unset

尝试从这样的数组中删除空值。每次使用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没有被设置?

2 个答案:

答案 0 :(得分:3)

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

这是一个单线解决方案:

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

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

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

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

答案 1 :(得分:2)

这应该适合你:

<?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!