2014-11-21 3 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); 
에서 617,451,515,

출력

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)

그래서 for 루프는 상태를 점검 것마다 반복! 따라서 배열의 값을 설정 해제하면 카운트가 작아집니다! 그리고 2 unset의 for 루프는 더 이상 인덱스 4에 도달하지 않습니다!

+0

어떤 생각을 왜 다른 하나는 내가 것보다 그 이상을 이해할 필요가 작동하지 않습니다 작업 코드를 찾습니다. –

+0

@RomanToasov for 루프에서 조건에 count를 사용하기 때문에 버전이 작동하지 않습니다! 따라서 2 개의 인덱스를 설정하지 않으면 인덱스 4에 도달하지 못하고 설정되지 않습니다. 따라서 for 루프에 들어가기 전에 카운트 값을 지정해야합니다! – Rizier123

+1

Brilliant! 중간 표현은 for()가 모든 루프를 한 번만 평가하는 것이 아니라는 사실을 잊어 버렸습니다. "각 반복의 시작 부분에서 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]); 
} 
관련 문제