Programing

foreach 루프에서 배열 요소를 어떻게 제거합니까?

lottogame 2020. 7. 23. 19:03
반응형

foreach 루프에서 배열 요소를 어떻게 제거합니까?


foreach값이 존재하는지 확인하기 위해 배열을 반복하고 싶습니다 . 값이 존재하면 값을 포함하는 요소를 삭제하고 싶습니다.

다음 코드가 있습니다.

foreach($display_related_tags as $tag_name) {
    if($tag_name == $found_tag['name']) {
        // Delete element
    }
}

값을 찾으면 요소를 삭제하는 방법을 모르겠습니다. 어떻게 삭제합니까?

foreach이 문제 에 사용해야 합니다. 에 대한 대안이있을 foreach수 있으며 공유 할 수 있습니다.


키가 있으면 다음과 같이 해당 항목을 삭제할 수 있습니다.

foreach ($display_related_tags as $key => $tag_name) {
    if($tag_name == $found_tag['name']) {
        unset($display_related_tags[$key]);
    }
}

더 나은 해결책은 다음 array_filter기능 을 사용하는 것입니다.

$display_related_tags =
    array_filter($display_related_tags, function($e) use($found_tag){
        return $e != $found_tag['name'];
    });

PHP 문서는 다음과 같이 읽습니다.

foreach는 PHP 5의 내부 배열 포인터를 사용하므로 루프 내에서 포인터를 변경하면 예기치 않은 동작이 발생할 수 있습니다.

PHP 7에서 foreach는 내부 배열 포인터를 사용하지 않습니다.


foreach($display_related_tags as $key => $tag_name)
{
    if($tag_name == $found_tag['name'])
        unset($display_related_tags[$key];
}

배열에서 foreach () 루프를 수행하는 대신 array_search ()를 사용하여 적절한 키를 찾는 것이 더 빠릅니다. 작은 배열에서는 가독성을 높이기 위해 foreach를 사용하지만 더 큰 배열 또는 종종 실행되는 코드의 경우 조금 더 최적화해야합니다.

$result=array_search($unwantedValue,$array,true);
if($result !== false) {
  unset($array[$result]);   
}

array_search ()가 $ unwantedValue의 인덱스로 0을 반환 할 수 있기 때문에 엄격한 비교 연산자! ==가 필요합니다.

또한 위의 예제는 $ unwantedValue의 첫 번째 값만 제거합니다. $ unwantedValue가 $ array에서 두 번 이상 발생할 수있는 경우 array_keys ()를 사용하여 모든 값을 찾아야합니다.

$result=array_keys($array,$unwantedValue,true)
foreach($result as $key) {
  unset($array[$key]);
}

자세한 내용은 http://php.net/manual/en/function.array-search.php확인 하십시오 .


이미 언급했듯이 키로 foreach를 수행하고 키를 사용하여 설정을 해제하고 싶지만 반복하는 동안 배열을 변경하는 것은 일반적으로 나쁜 생각이지만 PHP의 규칙에 대해서는 잘 모르겠습니다. 아무렇게나.


사용하려고 next(), current()에서 함수 while, for주기.


이 경우 foreach 배열에서 하나 이상의 값을 제거 해야하는 시나리오가있는 경우 각각에 대해 참조로 값을 전달해야합니다.이 시나리오를 설명하려고합니다.

foreach ($manSkuQty as $man_sku => &$man_qty) {

               foreach ($manufacturerSkus as $key1 => $val1) {

  // some processing here and unset first loops entries                     
 //  here dont include again for next iterations
                           if(some condition)
                            unset($manSkuQty[$key1]);

                        }
               }
}

두 번째 루프에서는 첫 번째 루프를 설정 해제하려는 경우 성능 목적으로 반복에서 항목을 다시 가져 오지 않거나 메모리에서 설정을 반복하여 메모리에서 설정을 해제합니다.


There are already answers which are giving light on how to unset. Rather than repeating code in all your classes make function like below and use it in code whenever required. In business logic, sometimes you don't want to expose some properties. Please see below one liner call to remove

public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset)
{
    if (empty($associativeArray) || empty($keysToUnset))
        return array();

    foreach ($associativeArray as $key => $arr) {
        if (!is_array($arr)) {
            continue;
        }

        foreach ($keysToUnset as $keyToUnset) {
            if (array_key_exists($keyToUnset, $arr)) {
                unset($arr[$keyToUnset]);
            }
        }
        $associativeArray[$key] = $arr;
    }
    return $associativeArray;
}

Call like:

removeKeysFromAssociativeArray($arrValues, $keysToRemove);

참고URL : https://stackoverflow.com/questions/1949259/how-do-you-remove-an-array-element-in-a-foreach-loop

반응형