[php] 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 배열에서 하나 이상의 값을 제거해야하는 시나리오가있는 경우 각각에 대해 참조로 값을 전달해야합니다.이 시나리오를 설명하려고합니다.

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]);

                        }
               }
}

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


답변

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

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


답변

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