У меня есть массив, который выглядит так:
$sites = array('Twitter' => 'http://twitter.com/home?status=$status', 'Digg' => 'http://digg.com/submit?phase=2&title=$title', .... ); $status = 'bla bla'; $title = 'asdasf'; foreach($sites as $site_name=>$site_url) echo '<li><a href="'.$site_url.'">'.$site_name.'</a></li>';
Обратите внимание на ключевые слова $ status и $ title в полях массива. Есть ли способ, которым я могу "сопоставить" эти ключевые слова с переменными, которые я установил ниже?
так что результат будет:
<li><a href="http://twitter.com/home?status=bla bla">Twitter</a></li>';
Строки в одинарных кавычках не будут выполнять подстановку переменных.Установите переменные перед массивом и используйте двойные кавычки.Мне также нравится использовать скобки для ясности:
$status = 'bla bla'; $title = 'asdasf'; $sites = array('Twitter' => "http://twitter.com/home?status={$status}", 'Digg' => "http://digg.com/submit?phase=2&title={$title}", .... );
Сначала присвойте $ status и $ title, а затем пусть строковая интерполяция сделает всю работу за вас при создании массива. Для работы потребуется изменение двойных кавычек. См:
http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing
Почему бы не сделать это, сначала установите $status и $title, а затем добавьте к производимому вами массиву.Затем они готовы и настроены на то, когда вы выводите ссылку
$status
$title
$status = 'bla bla'; $title = 'asdasf'; $sites = array('Twitter' => 'http://twitter.com/home?status=' . $status, 'Digg' => 'http://digg.com/submit?phase=2&title=' . $title, .... ); foreach($sites as $site_name=>$site_url) echo '<li><a href="'.$site_url.'">'.$site_name.'</a></li>';
Если вы можете переместить код:
$status = 'bla bla'; $title = 'asdasf'; $sites = array('Twitter' => "http://twitter.com/home?status=$status", 'Digg' => "http://digg.com/submit?phase=2&title=$title", .... );
В противном случае:
function get_sites($status, $title) { return array('Twitter' => "http://twitter.com/home?status=$status", 'Digg' => "http://digg.com/submit?phase=2&title=$title", .... ); } $sites = get_sites('bla blah', 'asdasf');
В качестве другой альтернативы:
$sites = array('Twitter' => 'http://twitter.com/home?status=$status', 'Digg' => 'http://digg.com/submit?phase=2&title=$title', .... ); foreach($sites as $site_name=>$site_url) { $site_url = strtr($site_url, array('$status' => 'bla blah', '$title' => 'asdasf')); echo '<li><a href="'.$site_url.'">'.$site_name.'</a></li>'; }
Я бы не рекомендовал последний подход, если не нужно менять много произвольного контента.
Первый - лучший, если он работает на вас.
Не будет ли это работать ...
$status = 'bla bla'; $title = 'asdasf'; foreach($sites as $site_name=>$site_url){ echo '<li><a href="'.$site_url.'?status='.$status">'.$site_name.'</a></li>'; }
Я не уверен, что вы пытаетесь сделать с $ title
Используйте вложенные sprintf, если хотите определить $status после объявления $sites:
sprintf
$sites
<?php // $sites is defined in a bootstrap / settings file .... $sites = array( 'Twitter' => 'http://twitter.com/home?status=%s', 'Digg' => 'http://digg.com/submit?phase=2&title=%s', ); .... // $status can be dynamic, loaded from a db, etc. $status = 'omglol'; .... // And output! foreach ($sites as $name => $url) { echo sprintf('<li><a href="%s">%s</a></li>', sprintf($url, $status), $name); }