[php] PHP foreach는 원래 배열 값을 변경합니다.

나는 다차원 배열에서 매우 새롭고 이것이 큰 시간을 보내고 있습니다.

내 배열은 다음과 같습니다.

$fields = array(
    "names" => array(
         "type"         => "text",
         "class"        => "name",
         "name"         => "name",
         "text_before"  => "name",
         "value"        => "",
         "required"     => true,
    )
)

그런 다음 필요한 경우 입력이 채워져 있는지 확인하는 기능이 있습니다.

function checkForm($fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

이제 내 문제는이 줄입니다

$fields[$field]['value'] = "Some error";

이것을 반환하기 때문에 원래 배열의 내용을 변경하고 싶지만 foreach 루프에서 현재 배열의 이름 (이 예제의 이름)을 어떻게 얻습니까?



답변

PHP에서 참조 ( &)로 전달하는 것은 논쟁의 여지가 있습니다. 왜 필요한지 알고 결과를 테스트하지 않는 한 사용하지 않는 것이 좋습니다.

다음을 수행하는 것이 좋습니다.

foreach ($fields as $key => $field) {
    if ($field['required'] && strlen($_POST[$field['name']]) <= 0) {
        $fields[$key]['value'] = "Some error";
    }
}

따라서 기본적으로 $field$fields[$key]이 필요할 때 와 데이터를 변경해야 할 때 사용합니다.


답변

사용 &:

foreach($arr as &$value)
{
     $value = $newVal;
}

&배열의 값을 참조로 전달하고 변수의 새 인스턴스를 작성하지 않습니다. 따라서 참조를 변경하면 원래 값이 변경됩니다.

http://php.net/manual/en/language.references.pass.php

2018 년 편집
이 답변은 인터넷상의 많은 사람들이 선호하는 것 같습니다. 그래서 더 많은 정보와주의를 기울이기로 결정했습니다.
참조로 foreach(또는 기능에서) 참조 는 깨끗하고 짧은 해결책이지만 많은 초보자에게는 이것이 위험한 함정일 수 있습니다.

  1. PHP의 루프에는 자체 범위가 없습니다. -@ 마크 애 머리

    변수가 동일한 범위에서 재사용되는 경우 심각한 문제가 될 수 있습니다. 또 다른 SO 질문은 이것이 왜 문제가 될 수 있는지 잘 보여줍니다.

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

    동일한 루프에서 반복하는 동안 레코드를 설정 해제하거나 해시 값 (키)을 변경하면 PHP <7에서 예기치 않은 동작이 발생할 수 있습니다.이 문제는 배열 자체가 참조 일 때 더욱 복잡해집니다.

  3. 각 성능.
    일반적으로 PHP는 copy-on-write 기능으로 인해 값으로 전달하는 것을 선호합니다. 즉, 내부적으로 PHP는 복사본을 변경하지 않으면 중복 데이터를 만들지 않습니다. 참조에 의한 전달 foreach이 성능 향상을 제공 하는지 여부는 논쟁의 여지 가 있습니다. 항상 그렇듯이 특정 시나리오를 테스트하고 더 적은 메모리와 CPU 시간을 사용하는 옵션을 결정해야합니다. 자세한 내용은 아래 NikiC에서 링크 한 SO 게시물을 참조하십시오.

  4. 코드 가독성.
    PHP에서 참조를 작성하는 것은 빠르게 처리되지 않는 것입니다. 당신이 초보자이고 당신이하고있는 일을 완전히 통제 할 수 없다면, 참고 문헌에서 멀리 떨어져있는 것이 가장 좋습니다. &연산자에 대한 자세한 내용은 이 안내서를 참조하십시오 . 참조 — PHP에서이 기호의 의미는 무엇입니까?
    PHP 언어의이 부분에 대해 더 배우고 싶은 사람들을 위해 : PHP References Explained

PHP foreach 루프의 내부 로직에 대한 @NikiC의 매우 좋은 기술 설명 :
PHP ‘foreach’는 실제로 어떻게 작동합니까?


답변

사용 foreach($fields as &$field){-원본 배열로 작업합니다.

참조로 전달하는 방법에 대한 자세한 내용은 다음과 같습니다 .


답변

function checkForm(& $fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

이것이 내가 참조로 전달하는 것입니다.


답변

이 시도

function checkForm($fields){
        foreach($fields as $field){
            if($field['required'] && strlen($_POST[$field['name']]) <= 0){
                $field['value'] = "Some error";
            }
        }
        return $field;
    }


답변