직장에서 발생할 수 있는 문제에 대해 이야기해 보겠습니다. 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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.