>  기사  >  백엔드 개발  >  PHP의 "구덩이"

PHP의 "구덩이"

WBOY
WBOY원래의
2016-08-08 09:27:121176검색

직장에서 발생할 수 있는 문제에 대해 이야기해 보겠습니다. foreach의 인용문

<span>$arr</span> = <span>range</span>(1,3<span>);
</span><span>//</span><span>[1,2,3]</span>

<span>foreach</span>(<span>$arr</span> <span>as</span> &<span>$val</span><span>) {
}

</span><span>foreach</span>(<span>$arr</span> <span>as</span> <span>$val</span><span>) {
}
</span><span>print_r</span>(<span>$arr</span><span>);
 </span>

위 코드는 무엇을 출력하나요? 제가 직장에서 이런 일을 겪은 적이 있는데, 원인을 찾는 데 시간이 오래 걸렸는데, 이를 해결하는 방법은 두 가지가 있습니다. 문제 번호:

<span>Array</span><span>
(
    [</span>0] => 1<span>
    [</span>1] => 2<span>
    [</span>2] => 2<span>
)</span>

다음 두 가지 방법으로 위의 문제를 해결할 수 있습니다.

<span>//</span><span>方法1</span>
<span>foreach</span> (<span>$arr</span> <span>as</span> &<span>$value</span><span>) {
}
</span><span>unset</span>(<span>$value</span><span>);
</span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$value</span><span>) {
}
</span><span>print_r</span>(<span>$arr</span><span>);
</span><span>//</span><span>[1,2,3]

//方法2</span>
<span>foreach</span> (<span>$arr</span> <span>as</span> &<span>$value</span><span>) {
}
</span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$val</span><span>) {
}
</span><span>print_r</span>(<span>$arr</span><span>);
</span><span>//</span><span>[1,2,3]
//方法3</span>
<span>foreach</span> (<span>$arr</span> <span>as</span> &<span>$value</span><span>) {
}
</span><span>foreach</span> (<span>$arr</span> <span>as</span> &<span>$value</span><span>) {
}
</span><span>print_r</span>(<span>$arr</span><span>);
</span><span>//</span><span>[1,2,3]</span>

방법 1은 공식 매뉴얼 http://php.net/manual/en/control-structures.foreach.php에서도 볼 수 있습니다. 기사에는 이를 상기시키는 특별한 팁이 있습니다

방법 2와 방법 3이 괜찮은 이유는 사실 "원인"에 인용되어 있습니다. foreach의 &$value는 배열의 요소를 가리키는 포인터 변수입니다. 먼저 다음을 보면 이해하기 쉽습니다. tmp는 var의 저장 공간을 가리키는 var에 대한 참조입니다. tmp가 변경되면 var도 변경됩니다.

<span>$var</span> = 123<span>;
</span><span>$tmp</span> = &<span>$var</span><span>;
</span><span>$tmp</span> = 200<span>;
</span><span>echo</span> <span>$var</span><span>;
</span><span>//</span><span>200</span>

위의 내용을 더 잘 이해하기 위해 아래 도난당한 사진을 살펴보세요(ㅎㅎ, 원본 링크는 아래에 게시되어 있습니다)

자, 괜찮다면 다음을 보세요(위 그림을 그리는 데 어떤 소프트웨어를 사용했는지 모르겠습니다. 손으로만 그릴 수 있어서 당황스럽습니다~~). 먼저 첫 번째 foreach를 살펴보세요.

두 번째 foreach:

이때 두 번째 foreach 루프에서는 배열의 마지막 요소 값이 첫 번째 요소부터 두 번째 요소, 마지막 요소까지 실제로 변경 가능하다는 것을 쉽게 알 수 있습니다. $value와 두 번째 foreach 간의 관계를 잘라내면 설정을 해제하거나 변수 이름을 변경하거나 포인터를 재설정할 수 있습니다(방법 3). 이 시점에서는 기본적으로 문제를 이해할 수 있습니다. 이 점.

자, 공식 문서 아래 댓글을 보시면 이해하기 쉬울 것 같습니다.

<?<span>php
</span><span>$arr1</span> = <span>array</span>("a" => 1, "b" => 2, "c" => 3<span>);
</span><span>$arr2</span> = <span>array</span>("x" => 4, "y" => 5, "z" => 6<span>);

</span><span>foreach</span> (<span>$arr1</span> <span>as</span> <span>$key</span> => &<span>$val</span><span>) {}
</span><span>foreach</span> (<span>$arr2</span> <span>as</span> <span>$key</span> => <span>$val</span><span>) {}

</span><span>var_dump</span>(<span>$arr1</span><span>);
</span><span>var_dump</span>(<span>$arr2</span><span>);
</span>?><span>

The output is</span>:
<span>array</span>(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> &int(6<span>) }
</span><span>array</span>(3) { ["x"]=> int(4) ["y"]=> int(5) ["z"]=> int(6) }

참고기사:

 http://www.cnblogs.com/CraryPrimitiveMan/p/4030748.html#3085766

http://www.jb51.net/article/39299.htm

이 글의 저작권은 저자 iforever(luluyrt@163.com)에게 있습니다. 글을 재인쇄한 후, 저자와 원문 링크 없이는 어떠한 형태의 전재도 금지됩니다. 기사 페이지의 명확한 위치에 제공되어야 합니다. 그렇지 않으면 법적 책임을 추구할 권리가 있습니다.

위 내용은 PHP의 "구덩이"를 소개했으며 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.