2014-11-21 42 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) 

取消設置不工作

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 unset之後,for循環不再達到索引4了!

+0

任何想法,爲什麼其他人不工作,我需要了解更多的比找到一個工作代碼。 – 2014-11-21 04:10:43

+0

@RomanToasov你的版本不工作,因爲你在for循環中使用條件!因此,如果您取消設置了2個索引,則索引不會達到索引4,也不會取消設置!所以你必須在進入for循環之前分配計數值! – Rizier123 2014-11-21 04:23:10

+1

輝煌!我忘了中間表達式是()不是隻對一次循環進行評估。 「在每次迭代開始時,評估expr2。」 http://php.net/manual/en/control-structures.for.php – 2014-11-21 04:26:14

3

您的代碼存在的問題是,當您點擊索引4時,它將等於您的數組大小,並停止循環。

有一襯墊解決這一:

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

它執行每個陣列元素上strlen()並返回與不是空字符串元素的數組。

另一種方法是找到對應於空字符串值的鍵,然後unset()這些鍵逐個主陣列中:

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