2012-12-11 7 views
1

다음 예제에서 배열이 문자열 연결로 업데이트되지 않는 이유를 알고 싶습니다. PHP 파일의 변수 범위가 Smarty로 전달되었습니다.

$scripts = array("jquery.js","bootstrap.min.js", 
       "jquery-jvectormap-1.0.min.js", 
       "jquery-jvectormap-us-aea-en.js", 
       "protoFluid.js"); 

foreach($scripts as $script) 
$script = "/scripts/".$script;     

$smarty -> assign('scripts',$scripts); 

나는, 예를 들어, /scripts/jquery.jsjquery.js에서 $scripts[0]을 변경하려면이 코드를 예상했다. 그러나 Smarty 디버그 콘솔은 다음을 보여줍니다.

Smarty_Variable Object (3) 
->value = Array (5) 
0 => "jquery.js" 
1 => "bootstrap.min.js" 
2 => "jquery-jvectormap-1.0.min.js" 
3 => "jquery-jvectormap-us-aea-en.js" 
4 => "protoFluid.js" 
->nocache = false 
->scope = "Smarty root" 

답변

2
의 Foreach이 배열의 카피에 노력하고 있습니다

, 당신이해야 할 :

foreach($scripts as &$script) 
    $script = "/scripts/".$script; 
+1

사실은 그렇지 않습니다. 그것은 복사본에서 작동하지 않는다.'$ script' 변수는 당신이 그것을 수정하려 할 때 복사된다. 같은 결과지만, 다른 이유. –

+0

예, 그렇지만 $ scripts는 변경되지 않으며 smarty와는 아무런 관련이 없습니다. –

+1

나는 그것을 논박하지 않고 있는데, 나는 그것이 작동하지 않는 이유는'foreach'가 배열의 복사본에서 작동하기 때문이 아니라고 말하고있다. –

1

은 여전히 ​​나중에 원래의 배열을 필요로하는지 여부에 따라 수정 된 사본을 만들 수 array_map()를 사용할 수 있습니다 :

$smarty->assign('scripts', array_map(function($script) { 
    return "/scripts/$script"; 
}, $scripts)); 
+0

PHP에서 변수를 수정하려고하면 변수가 복사된다는 점을 상기시켜 주셔서 고마워요. 잊지 않는 것이 중요합니다. – mac389

관련 문제