2014-11-21 5 views
2

Пытается удалить пустые значения из массива вроде этого. Он пропускает один ключ каждый раз, когда я использую 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) 


Почему ваша версия не работает?

Потому что в вашем цикле для вас есть условие: $i < count($values_arr)

Таким образом, каждый итерации для цикла он собирается проверить состояние! Поэтому, если вы отключите значение в массиве, количество get будет меньше! И после 2 unset's цикл for больше не достигает индекса 4!

+0

Любая идея, почему другой не работает, мне нужно, чтобы понять, что более найти рабочий код. –

+0

@RomanToasov Ваша версия не работает, потому что в вашем цикле for вы используете счет в состоянии! Поэтому, если вы отменили индекс 2, он не достигнет индекса 4 и не будет отменен! Поэтому вам нужно будет присвоить значение счета перед тем, как перейти в цикл for! – Rizier123

+1

Блестящий! Я забыл, что среднее выражение для() оценивает каждый цикл не один раз. «В начале каждой итерации вычисляется expr2». http://php.net/manual/en/control-structures.for.php –

3

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

Там в один лайнере решения этой проблемы:

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

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

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

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