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