Использование 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)

Unset не работает

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

Решение

Это должно работать для вас:

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

2

Другие решения

Проблема с вашим кодом в том, что к тому времени, когда вы нажимаете на индекс 4 он будет равен размеру вашего массива, и цикл останавливается.

Для этого есть однострочное решение:

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

Выполняет strlen() на каждый элемент массива и возвращает новый массив с элементами, которые не являются пустыми строками.

Другой способ — найти ключи, соответствующие пустым строковым значениям, а затем unset() эти ключи один за другим в основном массиве:

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

По вопросам рекламы [email protected]