[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
(또는 기능에서) 참조 는 깨끗하고 짧은 해결책이지만 많은 초보자에게는 이것이 위험한 함정일 수 있습니다.
-
PHP의 루프에는 자체 범위가 없습니다. -@ 마크 애 머리
변수가 동일한 범위에서 재사용되는 경우 심각한 문제가 될 수 있습니다. 또 다른 SO 질문은 이것이 왜 문제가 될 수 있는지 잘 보여줍니다.
-
foreach는 PHP 5의 내부 배열 포인터를 사용하므로 루프 내에서 포인터를 변경하면 예기치 않은 동작이 발생할 수 있습니다. -foreach 용 PHP 문서
동일한 루프에서 반복하는 동안 레코드를 설정 해제하거나 해시 값 (키)을 변경하면 PHP <7에서 예기치 않은 동작이 발생할 수 있습니다.이 문제는 배열 자체가 참조 일 때 더욱 복잡해집니다.
-
각 성능.
일반적으로 PHP는 copy-on-write 기능으로 인해 값으로 전달하는 것을 선호합니다. 즉, 내부적으로 PHP는 복사본을 변경하지 않으면 중복 데이터를 만들지 않습니다. 참조에 의한 전달foreach
이 성능 향상을 제공 하는지 여부는 논쟁의 여지 가 있습니다. 항상 그렇듯이 특정 시나리오를 테스트하고 더 적은 메모리와 CPU 시간을 사용하는 옵션을 결정해야합니다. 자세한 내용은 아래 NikiC에서 링크 한 SO 게시물을 참조하십시오. -
코드 가독성.
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;
}