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


127

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

다음 코드가 있습니다.

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

값이 발견되면 요소를 삭제하는 방법을 모르겠습니다. 어떻게 삭제하나요?

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

답변:


220

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

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


5
항목이 설정되지 않은 인덱싱 된 배열은 뒤에 배열 대신 객체로 표시 될 수 있습니다 json_encode(). 루프 $display_related_tags = array_values ($display_related_tags);이후로 이것을 해결할 수 있습니다 foreach.
Márton Tamás

트릭은 여기에 참고 ;-) foreach는 루프에 값을 추가하는 것입니다
씨 워싱턴

5
@Neils 답변을 참조하십시오. 특히 Array of stdClasses로 작업하는 경우 예기치 않은 버그가 발생합니다. 예상치 못한 행동을 좋아합니까? 나 아니야.
happy_marmoset

@happy_marmoset Neils 답변이 도움이되지 않습니다. 스 니펫은 $projects = array_filter($projects, function ($project) { return count($project->roles) > 0; });결과를 객체로 변환합니다.
Paritosh

36

더 나은 해결책은 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는 내부 배열 포인터를 사용하지 않습니다.


여기에서 키를 $ e로 전달하려면 세 번째 매개 변수가 ARRAY_FILTER_USE_KEY 여야합니다.
namezero

@namezero OK 왜 여기서 중요한가요?
AbraCadaver

@AbraCadaver 문서에서 ( php.net/manual/en/function.array-filter.php ) : ARRAY_FILTER_USE_KEY - pass key as the only argument to callback instead of the value ARRAY_FILTER_USE_BOTH - pass both value and key as arguments to callback instead of the value Default is 0 which will pass value as the only argument to callback instead. 즉, 물론이 경우 답변을 다시 읽는 것은 귀하가 주장하는대로 중요하지 않습니다.
namezero

중요 배열을 정렬 된 배열로 유지하려면 display_related_tags = array_values(display_related_tags);나중에 호출해야 합니다.
guyaloni

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

3
'unlink'는 파일의 링크를 해제하며, 변수 또는 특히 배열과는 관련이 없습니다. 아마도 'unset'을 의미합니까?
amn

6

배열에서 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 를 확인 하십시오 .


0

이 경우 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]);

                        }
               }
}

두 번째 루프에서 첫 번째 루프 항목을 설정 해제하고 싶습니다. 성능 목적을 위해 반복에서 다시 오지 않거나 메모리에서 존재하고 반복으로 올 것이기 때문에 메모리에서 설정 해제하십시오.


0

설정 해제 방법에 대한 답변이 이미 있습니다. 모든 클래스에서 코드를 반복하는 대신 아래와 같이 기능을 만들고 필요할 때마다 코드에서 사용하십시오. 비즈니스 로직에서 때로는 일부 속성을 노출하고 싶지 않습니다. 제거하려면 하나의 라이너 호출 아래를 참조하십시오.

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;
}

다음과 같이 전화하십시오.

removeKeysFromAssociativeArray($arrValues, $keysToRemove);

-1

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


2
PHP foreach는 관계없이 전체 배열에서 실행됩니다. 다음 반복 값의 설정 해제를 테스트합니다. 오프셋에서 반복되지만 값은 null입니다.
Kevin Peno

반복 중에 배열을 변경하지 않으면 배열을 어떻게 변경합니까? 일반적으로 반복 대신 평균 foreach또는 for구성 일 수 있습니까?
Gherman 2014-08-20

이것은 대답 자체보다는 다른 대답에 대한 주석에 가깝습니다.
Sinister Beard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.