[php] foreach 루프 내의 배열에서 객체를 삭제하는 방법은 무엇입니까?

객체 배열을 반복하고 ‘id’속성에 따라 객체 중 하나를 삭제하려고하지만 코드가 작동하지 않습니다.

foreach($array as $element) {
    foreach($element as $key => $value) {
        if($key == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($element);//this doesn't work
            unset($array,$element);//neither does this
        }
    }
}

어떤 제안이라도. 감사.



답변

foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        }
    }
}


답변

설정 해제에 대한 구문이 유효하지 않은 것 같습니다. 다시 색인화가 없으면 나중에 문제가 발생할 수 있습니다. PHP 배열 섹션을 참조하십시오 .

올바른 구문은 위에 나와 있습니다. 또한 재 인덱싱을위한 배열 값 을 염두에두고 이전에 삭제 한 항목을 인덱싱하지 마십시오.


답변

foreach값에 대한 참조를 사용할 수도 있습니다 .

foreach($array as $elementKey => &$element) {
    // $element is the same than &$array[$elementKey]
    if (isset($element['id']) and $element['id'] == 'searched_value') {
        unset($element);
    }
}


답변

이 트릭을해야합니다 …..

reset($array);
while (list($elementKey, $element) = each($array)) {
    while (list($key, $value2) = each($element)) {
        if($key == 'id' && $value == 'searched_value') {
            unset($array[$elementKey]);
        }
    }
}


답변

주요 답변에주의하십시오.

[['id'=>1,'cat'=>'vip']
,['id'=>2,'cat'=>'vip']
,['id'=>3,'cat'=>'normal']

그리고 함수를 호출

foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'cat' && $value == 'vip'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        }
    }
}

그것은 반환

[2=>['id'=>3,'cat'=>'normal']

대신에

[0=>['id'=>3,'cat'=>'normal']

unset은 배열을 다시 색인화하지 않기 때문입니다.

다시 색인을 생성합니다. (필요한 경우)

$result=[];
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        $found=false;
        if($valueKey === 'cat' && $value === 'vip'){
            $found=true;
            $break;
        }
        if(!$found) {
           $result[]=$element;
        }
    }
}


답변

나는 PHP 프로그래머가 아니지만 C #에서는 배열을 반복하는 동안 배열을 수정할 수 없다고 말할 수 있습니다. foreach 루프를 사용하여 요소 또는 제거 할 요소의 색인을 식별 한 다음 루프 뒤의 요소를 삭제하려고 할 수 있습니다.


답변