【问题标题】:Variable variables with drupal使用 drupal 的变量
【发布时间】:2012-02-22 19:50:47
【问题描述】:

我正在主题化一个drupal 内容类型,并且我有一组类似命名的变量。例如字段_anp_1,字段_anp_2,...,字段_anp_10。我想从 for 循环中动态打印出来。通常,人们会通过执行以下操作单独打印出这些值: print $field_anp_1[0]['value'];

就我而言,我不能这样做,因为最后一个数字发生了变化。那么,在 for 循环中,如何打印出这些字段?我尝试了变量变量,但我似乎并不完全理解那里发生了什么——而且我认为它不喜欢 this 在数组中的事实。任何帮助将不胜感激!

【问题讨论】:

  • 我仍然不完全清楚您要做什么。也许您可以包含您的表单的编辑版本,以及您所拥有的 PHP 代码?

标签: php drupal variables themes cck


【解决方案1】:

绝对不是数组。但是你可以使用变量作为变量的名称{..}

ghoti@pc:~ $ cat invar.php
#!/usr/local/bin/php
<?php

$field_anp_3="three";
$field_anp_2="two";

for ($i=1; $i<5; $i++) {
  $thisvar="field_anp_" . $i;
  if (isset(${$thisvar})) {
    printf("%s: %s\n", $i, ${$thisvar});
  } else {
    printf("%s: not set\n", $i);
  }
}

ghoti@pc:~ $ ./invar.php
1: not set
2: two
3: three
4: not set

或者,如果您确定确实存在的变量将是连续的。您可以在失败时停止(以下每个 cmets):

#!/usr/local/bin/php
<?php

$field_anp_1="one";
$field_anp_2="two";
$field_anp_3="three";

for ($i=1; $i<5; $i++) {
  $thisvar="field_anp_" . $i;
  if (!isset(${$thisvar})) {
    break;
  }
  printf("%s: %s\n", $i, ${$thisvar});
}

【讨论】:

  • 这将设置检索变量的硬编码限制,据我了解,当变量的数量可能不同时。
  • 这个简短的脚本旨在演示如何使用变量作为变量的名称。 Drupal 的确切应用程序需要比问题中提供的更多细节。如果变量列表是连续的,那么遍历它们直到 isset() 为 false 就足以击中所有变量。
  • 这与我的想法一致。但是,当我尝试实现它时,它不起作用。 $field_anp_X 的结构如下:$field_anp_1[0]['value']。出于某种原因,似乎有一个数组会导致问题。
  • 另外——变量实际上并不是连续的。但是,我所做的是创建一个带有结尾数字的数组。因此,我在 for 循环中使用 $courses[$i] 而不是 $i 。
  • 感谢您的代码,ghoti - 它帮助我更好地理解变量变量。由于您的帖子,我能够在答案中提出代码。
【解决方案2】:

我认为没有理由生成无数这样的变量。但这就是你收集它们的方式:

$vars = array();
foreach(get_defined_vars() as $name => $value) {
    if(strpos($name, 'field_anp_') === 0) {
        $vars[$name] = $value;
    }
}

现在您将在$vars 中将您的值作为关联数组。您可以直接打印它们,而不是将这些值添加到 $vars

更新回应您的评论

$array = array('foo' => 'bar');
$x = 'foo';
$field_anp_bar = 'baz';
echo ${'field_anp_' . $array[$x]};

【讨论】:

  • 感谢您的回复 - 此代码非常有用,但不完全是我需要的。目前,我可以按名称访问所有变量。例如field_anp_1 现在可以直接打印了。但是,我正在尝试从 for 循环中打印它们。我实际上所做的是创建了一个带有我需要打印的后缀的数组。我的目标是遍历该数组并打印 $field_anp_$array[$x] 变量。
  • 感谢更新代码。我能够弄清楚,您的回答非常有用。我使用 drupal 为其他有同样问题的人发布了一个答案 - 也许它会告诉你我所追求的。
  • 刚刚接受。我建议的唯一更改是针对 drupal 开发人员。要使用可变变量访问 $field_anp_123[0]['value'],他们需要执行以下操作:$var = 'field_anp_' . $array[$x]; print ${$var}[0]['value'];
【解决方案3】:

好的,我想通了。我只需要更具体地使用 PHP。要从 for 循环中调用诸如 $field_anp_0[0]['value'] 之类的变量,其中 0 是递增的,只需执行以下操作:

<?php
$numbers = array(123,235,12332,2342);

for($i; $i<count($numbers); $i++){
    $var = "field_anp_".$numbers[$i];
    printf("%s\n", ${$var}[0]['value']);

}
?>

这将允许我按照我需要打印的顺序列出我需要打印的字段。然后,例如,我可以使用 for 循环打印出一个主题表。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多