2017-11-10 8 views
1

참조로 전달하여 직접 배열의 값을 변경 (값을 대문자로 변환)하는 코드 스 니펫을 고려하십시오.임시 변수가 배열 요소를 변경하는 데 왜 필요하며 왜 결국 끝내야합니까?

<?php 
    $colors = array('red', 'blue', 'green', 'yellow'); 

    foreach ($colors as &$color) { 
    $color = strtoupper($color); 
    } 
    unset($color); /* ensure that following writes to 
    $color will not modify the last array element */ 

    print_r($colors); 

?> 

출력 :

Array 
(
    [0] => RED 
    [1] => BLUE 
    [2] => GREEN 
    [3] => YELLOW 
) 

나는 모든 위의 코드를 이해하지했습니다. 다음과 같이 내가 위의 코드에 대한 몇 가지 의문을했습니다 :

  1. 가 나는 foreach 루프 내부에서 모든 $color = strtoupper($color);에서이 문장을 이해하지 못했다. 임시 변수 $color이 사용되는 이유는 strtoupper() 참조 &$color이 전달되지 않고 $color 만 전달되는 이유는 무엇입니까?
  2. $color 변수가 설정 해제 되었습니까? 설정을 취소하기 전에 그 안에 무엇이 들어 있었습니까?
  3. 주석 의 의미가 배열의 마지막 요소로서 "다음은 마지막 배열 요소를 수정하지 않습니다 $ 색상에 기록되도록"즉 노란색도 무엇을 수정지고있어? 한마디로

는 단계 단계별 방식으로 foreach 루프의 코드에 거기에 무슨 일이 일어나고 있는지 설명해주십시오.

누군가 내 대답에 답하십시오.

참고 : 위의 코드 예제는 PHP Manual의 Array 장에서 가져 왔습니다.

+0

제거 /를'unset' 전화 주석의'$의 color' 변수에 쓰기 추가 마지막에'print_r' 호출 이전에) 꽤 빨리 얻을 수 있습니다. – Calimero

+0

요점은 unset()을 주석 처리/제거하여 실제 발생하는 마법을 확인하는 것입니다. 답변 올거야. – Calimero

+1

부수적으로, array_map을 사용할 수 있도록하기 위해서 : $ colors = array_map ("strtoupper", $ colors); –

답변

0

여기는 직장에서 방어 프로그래밍입니다.

foreach() 루프를 반복 할 때마다 $color 변수에 현재 항목 값에 대한 참조가 만들어지고 새 값을 쓸 수 있습니다. 반복이 끝나면 $color 변수에는 여전히 마지막 배열 항목의 값에 대한 참조가 포함되어 있으므로 프로그래머는 $color 변수를 쓰기 위해 다시 사용하여 배열의 해당 항목을 업데이트 할 수 있습니다. 이는 의도 한 결과가 아닐 수 있습니다. unset() 루프가 참조를 파기하고 해당 위험을 피한 후에 변수를 ting합니다.

<?php 
$colors = array('red', 'blue', 'green', 'yellow'); 

foreach ($colors as &$color) { 
    $color = strtoupper($color); 
} 
//unset($color); 
/* ensure that following writes to 
$color will not modify the last array element */ 

print_r($colors); 
$color='hello'; 
print_r($colors); 

출력 : 귀하의 예제의 상단에

건물

Array 
(
    [0] => RED 
    [1] => BLUE 
    [2] => GREEN 
    [3] => YELLOW 
) 
Array 
(
    [0] => RED 
    [1] => BLUE 
    [2] => GREEN 
    [3] => hello 
) 

https://eval.in/897010