PHP - чтение переменных из строкового поля массива - PullRequest
0 голосов
/ 21 сентября 2010

У меня есть массив, который выглядит так:

  $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>';

Ответы [ 6 ]

4 голосов
/ 21 сентября 2010

Строки в одинарных кавычках не будут выполнять подстановку переменных.Установите переменные перед массивом и используйте двойные кавычки.Мне также нравится использовать скобки для ясности:

$status = 'bla bla';
$title = 'asdasf';

$sites = array('Twitter' => "http://twitter.com/home?status={$status}",
                 'Digg' => "http://digg.com/submit?phase=2&amp;title={$title}",
                 ....
                );
2 голосов
/ 21 сентября 2010

Сначала присвойте $ status и $ title, а затем пусть строковая интерполяция сделает всю работу за вас при создании массива. Для работы потребуется изменение двойных кавычек. См:

http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

2 голосов
/ 21 сентября 2010

Почему бы не сделать это, сначала установите $status и $title, а затем добавьте к производимому вами массиву.Затем они готовы и настроены на то, когда вы выводите ссылку

$status = 'bla bla';
$title = 'asdasf';

$sites = array('Twitter' => 'http://twitter.com/home?status=' . $status,
    'Digg' => 'http://digg.com/submit?phase=2&amp;title=' . $title,
    ....
    );


foreach($sites as $site_name=>$site_url)
    echo '<li><a href="'.$site_url.'">'.$site_name.'</a></li>';
1 голос
/ 21 сентября 2010

Если вы можете переместить код:

$status = 'bla bla';
$title = 'asdasf';

$sites = array('Twitter' => "http://twitter.com/home?status=$status",
                 'Digg' => "http://digg.com/submit?phase=2&amp;title=$title",
                 ....
                );

В противном случае:

function get_sites($status, $title)
{
  return array('Twitter' => "http://twitter.com/home?status=$status",
                     'Digg' => "http://digg.com/submit?phase=2&amp;title=$title",
                     ....
                    );
}

$sites = get_sites('bla blah', 'asdasf');

В качестве другой альтернативы:

$sites = array('Twitter' => 'http://twitter.com/home?status=$status',
                 'Digg' => 'http://digg.com/submit?phase=2&amp;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>';
}

Я бы не рекомендовал последний подход, если не нужно менять много произвольного контента.

Первый - лучший, если он работает на вас.

1 голос
/ 21 сентября 2010

Не будет ли это работать ...

$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

0 голосов
/ 21 сентября 2010

Используйте вложенные sprintf, если хотите определить $status после объявления $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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...