【问题标题】:Smarty array with dot in key键中带点的 Smarty 数组
【发布时间】:2011-03-15 18:26:01
【问题描述】:

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

$config['detailpage.var1']
$config['detailpage.var2']
$config['otherpage.var2']
$config['otherpage.var2']
...

要在 Smarty 中访问它,我会这样做

$smarty->assign('config', $config);

使用此模板:

{$config.detailpage.var1}

不幸的是,这不起作用,因为我的数组键“detailpage.var1”中的点,对于 Smarty,它是数组元素的分隔符。 由于我不想重写我的配置数组(因为它在许多其他地方使用),我的问题是:

我可以使用其他符号来处理数组键中的点吗? 或者我能以某种方式逃脱它们吗?

【问题讨论】:

  • 我还建议您遵循 Zend 的编码标准:framework.zend.com/manual/en/…
  • 我绝对同意。但是项目已经有了这个变量。不过以后想想也是好事! +1

标签: php smarty


【解决方案1】:

尝试使用数组表示法 {$config['detailpage.var1']} 或 {$config[detailpage.var1]}。

【讨论】:

  • 不起作用。不允许使用 [:致命错误:未捕获的异常 'Exception',第 32 行“{$config.[detailpage.var1]}”上的模板“index.htm”中出现消息“语法错误” - 意外的“[”,预期其中之一: "{" , "$" , "identifier" , INTEGER' 我也试过 {$config{detailpage.var1}}
【解决方案2】:

您可以重新格式化关联数组中的键以符合 Smart Compiler Regex'es。

$configS = array();
foreach($config as $key => $value)
{
    $key = str_replace('.','_',$key);
    $configS[$key] = $value;
}
$smarty->assign('config', $configS);

$configS = array();
foreach($config as $key => $value) $configS[str_replace('.','_',$key)] = $value;
$smarty->assign('config', $configS);

现在您可以改用{$config.detailpage_var1},只需将. 替换为_


遍历数组,

function cleanKeysForSmarty(&item,$key)
{
    return array(str_replace('.','_',$key) => $value);
}
$smarty->assign("config",array_walk_recursive($config,'cleanKeysForSmarty'));

类似的东西。

【讨论】:

  • 将是一个很好的解决方法。 +1 谢谢。但我会等待是否有人提出更好的解决方案,然后再接受。
【解决方案3】:

不是最聪明的解决方案,但它应该可以工作:

{assign var=myKey value="detailpage.var1"}
{$config.$myKey}

【讨论】:

  • 好主意。 +1 但我更喜欢 RobertPitt 的解决方案,因为它对 $config-Array 中的所有变量都是自动化的。使用你的,我必须将 assign 行放在每个(第一个)配置变量调用的前面。
【解决方案4】:

用途:

{$array["key.with.dot"]}

或者:

{$array["key.with.dot"]["subkey"]}

【讨论】:

    【解决方案5】:

    在我在这里寻找答案之后,我“偶然”找到了这个问题的答案。在这种情况下,我使用主机名作为始终带有点的键。您可以使用虚线键名周围的 {} 访问它们。 例如{$var.foo.bar.{"my.hostname.example.com"}.ipaddress}.

    这种“转义”语法也可用于必须扩展包含点的变量的情况。例如{$var.foo.bar.{$var.bingo}}

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2023-03-20
      相关资源
      最近更新 更多