【问题标题】:How to save a PHP string with variable not explicit?如何保存变量不明确的PHP字符串?
【发布时间】:2012-12-21 13:07:48
【问题描述】:

我有一个这样的数组:

$list = array (
  "Today is ".$aaaa."/".$mm."/".$gg,
  "Oggi è il ".$gg."/".$mm."/".$aaaa,
  "Aujourd'hui, c'est ".$gg."/".$mm."/".$aaaa
);

我想将它们保存在数据库中(变量不明确),然后以 php 格式重新使用它们。 是否可以将php格式的字符串另存为字符串?

例子:

$gg = 1;
$myString = "Today is ".$gg;
echo $myString;

$gg = 17;
echo $myString;

当然,这个例子总是显示“今天是 1”。 我希望它显示“今天是 1”、“今天是 17”。 我可以用不明确的变量保存 myString 吗?

【问题讨论】:

  • 试试sprintf
  • 看起来您正在寻找国际化。为您要支持的国家/地区保留日期时间对象和格式说明符。 $gg$mm$aaaa 大多只会妨碍您。

标签: php string variables date internationalization


【解决方案1】:

使用printf

$myString = "Today is %s";

$today = '21/12/2012';
printf($myString,$today); // Today is 21/12/2012

$today = 21;
printf($myString,$today); // Today is 21

printf 将直接输出字符串。 sprintf 将返回它

编辑:在您的具体情况下,您应该指定订单

$list = array (
  'Today is %1$s/%2$s/%3$s',
  'Oggi è il %3$s/%2$s/%1$s',
  'Aujourd\'hui, c\'est %3$s/%2$s/%1$s'
);

foreach($list as $string) {
    printf($string,"2012","12","21");
    echo  " <br />";
}

但是对于本地化,我会使用 setlocale 函数来处理简单的字符串,使用 strftime(带有 setlocale)来处理本地化日期

【讨论】:

  • 如果变量顺序不同,如何处理for循环? (见问题中的数组)
【解决方案2】:

使用sprintf() 并保存格式。

【讨论】:

    【解决方案3】:

    我可以用不明确的变量保存 myString 吗?

    有点,是的。你可以实现:

    class MyStringVariable
    {
        private $mask;
        private $variables;
    
        public function __construct($mask, array $variables) {
            $this->mask = $mask;
            $this->variables = $variables;
        }
    
        public function __toString() {
            return vsprintf($this->mask, $this->variables);
        }
    }
    

    用法(Demo):

    $gg = 1;
    $myString = new MyStringVariable("Today is %s\n", [&$gg]);
    echo $myString;
    
    $gg = 17;
    echo $myString;
    

    输出:

    Today is 1
    Today is 17
    

    这基本上是通过将vsprintf(参见sprintf)包装到它自己的对象中来实现的,该对象还存储您要使用的变量引用。 magic __toString method 负责在需要时解析输出。

    【讨论】:

      【解决方案4】:
      $sql = 'My var is %s';
      
      $a = 100;
      $foo = sprintf($sql, $a);
      

      编辑 1;

      $list = array(
          "Today is %s/%s/%s",
          "Oggi è il %s/%s/%s",
          "Aujourd'hui, c'est %s/%s/%s"
      );
      
      foreach ($list as $str)
      {
          $a   = 2012;
          $m   = 12;
          $g   = 17;
      
          if (strstr($str, 'Today '))
              $foo = sprintf($str, $a, $m, $g);
          else
              $foo = sprintf($str, $g, $m, $a);
      }
      

      【讨论】:

        【解决方案5】:

        我不知道这是否是最好的方法,但它有效, 您将行保存为字符串,然后使用 eval() 转换为变量

        $list = array (
            'Today is ".$aaaa."/".$mm."/".$gg'
        );
        $aaaa = 2012;
        $mm = 11;
        $gg = 00;
        eval("\$mylist = \"$list[0];");
        echo $mylist;
        

        编码愉快!!

        【讨论】:

          猜你喜欢
          • 2022-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-05
          • 1970-01-01
          • 2013-08-14
          • 1970-01-01
          相关资源
          最近更新 更多