2013-06-27 4 views
3

많은 사람들에게 명백한 각 루프에 대해 배열에 대해 이해하려고합니다.foreach 루프에서 하위 배열에 요소를 넣을 수없는 이유는 무엇입니까?

내 다차원 배열을 통해 반복 할 때 세 번째 요소가없는 하위 배열을 찾으려고 시도합니다. 그들은 세 번째 요소가 없다면, 그 특정 값을 가진 그 하위 배열에 세 번째 요소를 추가하고 싶습니다.

$testArray = array (
    array("Green", "Yellow", "Blue"), 
    array("Brown", "Silver"), 
    array("Orange", "Pink", "Black"), 
); 

내가 foreach 루프를 사용하는 경우 :

foreach ($testArray as $key => $array) { 
    if (count($array) == '2') { 
     $array[] = "None"; 
    }; 
} 

오류가 발생되지하지만 아무 일도 발생하지 않습니다. 각 루프에 대해를 사용할 때 :

foreach ($testArray as $key => $array) { 
    if (count($array) == '2') { 
     $testArray[$key][] = "None"; 
    }; 
} 

예상대로 작동합니다. 긴 프리앰블 죄송합니다

, 내 질문은 다음과 같습니다

왜 같은 일을하고있는이 두 foreach는 루프 않나요? 감사!

+0

답 해 주셔서 감사합니다. 매우 유익했습니다. – jreidko

답변

2

문제는 여기에 반복 가능 객체를 통해 foreach는 반복이와 값으로 반복 변수를 설정한다는 사실에있다. 즉, foreach에서 처리중인 $array$testArray과 같지 않습니다.

$index 변수를 사용하여 배열의 항목을 변형시키지 않으려면 foreach에 pass the value by reference을 말해야합니다. 참고 문헌은 C 스타일 포인터에 대한 PHP의 대답입니다. 변수가 다른 변수를 참조하면 두 변수는 동일한 값을 가리키므로 한 변수의 내용을 수정하면 다른 변수가 수정됩니다.

foreach ($testArray as $key => &$array) { 
    if (count($array) == '2') { 
     $array[] = "None"; 
    } 
} 

(Codepad Demo) 하나 개의 변수가 될 수있는

이, PHP의 참조와 정렬 : 당신의 foreach에서는 루프가 참조 대신 값으로 당신에게 $testArray의 항목을 통과하도록 &$array을 사용할 수 있습니다

$a = array(1, 2, 3); 
$b = &$a; 
$b[] = 4; 

print_r($a); // 1, 2, 3, 4 

(Codepad Demo)

,536,913 : 다른과 같이 참조하려고 63,210

당신은 기능과 유사한 현상이 나타날 수

function byValue($a) { 
    $a[] = 4; 
} 

function byRef(&$a) { 
    $a[] = 5; 
} 

$a = array(1, 2, 3); 

byValue($a); 
print_r($a); // 1, 2, 3 

byRef($a); 
print_r($a); // 1, 2, 3, 5 

(Codepad Demo)

references section of the PHP docsforeach의 구문에 대한 몇 가지 예를 가지고있다. 또한 this (somewhat) related, but interesting read on foreach and references을 유의하십시오.


또한, 관련이없는 노트에 당신이 인식되지 않은 경우 : 당신이 변수에 폐쇄를 할당 같은 일을하지 않는 한 PHP에서 }로 블록을 닫은 후 세미콜론이 필요하지 않습니다 :

$someFunc = function($a) { return $a; }; //need one here 

if(1 + 2 == 4) { 
    echo "I just broke math"; 
} // but you don't need one here 
+0

감사합니다. Php, 매우 철저한 대답이며 참조가 작동하는 방식을 이해하는 데 매우 유용합니다. 답변 해 주신 모든 분들께도 감사드립니다. – jreidko

+0

또한 세미콜론에 대한 좋은 의견은 초보자로서 나는 그와 같은 기본적인 팁을 발견했습니다! 건배 - jreidko – jreidko

4

는 " 참조 "$ testArray 항목에 액세스 할 수

foreach ($testArray as &$array) { 
    if (count($array) == 2) { 
     $array[] = "None"; 
    }; 
} 
unset($array); 
0

foreach 루프 참조 요소를 통과하지 못한 필요하기 때문에. 당신이 원하는 것을 할 수있는 첫 번째 배열을 얻으려면, 그것은 될 것이다 :

foreach ($testArray as $key => &$array) { 
    if (count($array) == '2') { 
     $array[] = "None"; 
    }; 
}