尝试像这样从数组中删除空值。每次使用 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!