php数组中的庞德键/哈希键/哈希标签


Pound key/Hash key/hashtag in php arrays

我目前正在使用Drupal,他们有渲染数组。他们将磅键放在渲染数组的配置索引前面,然后由渲染函数使用。

但是!这个问题与Drupal无关。我在接下来的几行中提供的代码完全独立于任何php应用程序。香草PHP,正如一些人所说。

   <?php
    $array = array(
      '#title' => 'Social media button settings',
      '#type' => 'fieldset',
      array(
        '#title' => 'Facebook',
        '#type' => 'input',
      )
    );
    foreach($array as $i => $d) {
      // This line could contain ANY!!! key as long as it starts
      // with a pound key.
      if (isset($d['#title'])) {
        var_dump('Index: ' . $i);
        echo 'Data:';
        var_dump($d);
        var_dump('$d["#title"]: ' . $d['#title']);
      }
    }

输出为:

string 'Index: #title' (length=13)
Data:
string 'Social media button settings' (length=28)
string '$d["#title"]: S' (length=15)
string 'Index: #type' (length=12)
Data:
string 'fieldset' (length=8)
string '$d["#title"]: f' (length=15)
string 'Index: 0' (length=8)
Data:
array (size=2)
  '#title' => string 'Facebook' (length=8)
  '#type' => string 'input' (length=5)
string '$d["#title"]: Facebook' (length=22)

预期输出为:

string 'Index: 0' (length=8)
Data:
array (size=2)
  '#title' => string 'Facebook' (length=8)
  '#type' => string 'input' (length=5)
string '$d["#title"]: Facebook' (length=22)

我在这里没看到什么吗?这只是PHP中真正严重的错误吗?

很高兴收到你们的来信。

func0der

更新------>>

我使用的是由MAMP包装的PHP 5.3.27。在这里尝试:http://writecodeonline.com/php/两者的结果相同。

您的代码为我提供了您想要的输出。我怀疑有什么事在混乱的环境中。或者你在复制它或类似的东西。

-编辑-

以下评论的结论:isset在5.3和之前版本中存在缺陷。固定的5.4中。来自php.net:

非数字字符串偏移量-例如$a['fo'],其中$a是字符串-现在返回falseisset()和true在empty()上,并在尝试使用它们时生成E_WARNING。的偏移类型double、bool和null会生成E_NOTICE。数字字符串(例如$a['2'])仍然像以前一样工作。请注意,像"12.3"answers"5 foobar"这样的偏移被认为是非数字的并产生E_WARNING,但分别转换为12和5,用于向后兼容性原因。注意:以下代码返回不同的结果$str='abc';var_dump(isset($str['x']));//PHP 5.4或更高版本为false,但 5.3或更低版本为true

没有错,您的期望只是与PHP的工作方式不一致。

如果您希望将"title"answers"type"值视为一对,则需要以某种方式将它们组合在一起(而不仅仅是"将它们放在一起")。一种方法是将另一个数组包裹在每对数组周围,这将产生预期的输出。你已经在为Facebook/输入对做这件事了,所以删除其余的数据会得到你想要的输出:

$array = array(
  array(
    '#title' => 'Facebook',
    '#type' => 'input',
  )
);