【问题标题】:PHP - read variables from a array string fieldPHP - 从数组字符串字段中读取变量
【发布时间】:2011-04-15 08:46:17
【问题描述】:

我有一个如下所示的数组:

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

【问题讨论】:

  • 你的代码有什么问题?看起来它应该工作。我不确定你是否可以在 foreach 之后省略 {} 大括号,但否则看起来很好。
  • 它没有。我仍然在 url 字段中看到 $status 和 $title :(
  • 你必须在数组中使用双引号。
  • @JMC:好眼力。我错过了。仅此一项并不能解决问题,但正确的答案已经在下面了。

标签: php arrays string variables


【解决方案1】:

单引号字符串不会执行变量替换。在数组之前设置变量并使用双引号。为了清楚起见,我也喜欢使用大括号:

$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】:

    只需先分配 $status 和 $title,然后在创建数组时让字符串插值为您完成工作。它需要更改双引号才能工作。见:

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

    【讨论】:

      【解决方案3】:

      为什么不这样做,首先设置$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>';
      

      【讨论】:

      • 但它有效。我发现双引号字符串中的变量很难看。略读代码时,您无法轻易看到它们,它看起来就像一个字符串。这样你可以看到字符串停止并包含一个变量。
      【解决方案4】:

      这样不行吗……

      $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 做什么

      【讨论】:

        【解决方案5】:

        如果你可以移动代码:

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

        我不推荐最后一种方法,除非有很多任意内容需要更改。

        如果适合你,第一个是最好的。

        【讨论】:

          【解决方案6】:

          如果您想在$sites 声明之后定义$status,请使用嵌套的sprintf

          <?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);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-06
            • 1970-01-01
            • 1970-01-01
            • 2012-03-24
            • 1970-01-01
            • 2013-01-08
            • 1970-01-01
            相关资源
            最近更新 更多