2012-12-11 5 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[0] из jquery.js в /scripts/jquery.js. Однако консоль отладки 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

Да, но означает, что скрипты $ не будут изменены, и это не имеет ничего общего с smarty. –

+1

Я не оспариваю этого, я говорю, что причина, по которой он не работает, не потому, что 'foreach' работает над копией массива. –

1

В зависимости от того, по-прежнему нужен оригинальный массив после этого, вы можете использовать array_map() создать модифицированную копию:

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

спасибо, что напомнили мне, что в PHP переменная копируется при попытке ее изменить. Это важный момент, чтобы не забывать. – mac389

Смежные вопросы