Ключ фунта/хэш-ключ/хэштег в массивах php


В настоящее время я работаю с Drupal, и у них есть такая штука с массивами рендеринга. Они помещают ключи pound перед индексами конфигурации своих массивов рендеринга, которые затем используются функциями рендеринга.

НО! проблема не имеет ничего общего с 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?

Было бы здорово услышать от вас, ребята.

Функ0дер

Обновление ------>>

Я использую PHP 5.3.27, завернутый в MAMP. И попробовал это здесь: http://writecodeonline.com/php / Оба результата одинаковы.

Author: func0der, 2014-04-11

2 answers

Ваш код дает мне результат, который вы хотите. Я подозреваю, что в окружающей среде есть что-то, что все портит. Или вы допустили ошибку, скопировав его, или что-то в этом роде.

-редактировать -

Заключение комментариев ниже: isset содержит ошибки в 5.3 и предыдущих версиях. Исправлено в 5.4. Из php.net :

Нечисловые смещения строк - например, $a['foo'], где $a - строка, - теперь возвращают false в isset() и true в empty() и выдают предупреждение E_, если вы попытаетесь их использовать. Смещения типов double, bool и null приводят к E_NOTICE. Числовые строки (например, $a['2']) по-прежнему работают, как и раньше. Обратите внимание, что смещения, такие как "12.3" и "5 foobar", считаются нечисловыми и выдают предупреждение E_, но преобразуются в 12 и 5 соответственно по соображениям обратной совместимости. Примечание: Следующий код возвращает другой результат. $str='азбука'; var_dump(isset($str['x']));//ложно для PHP 5.4 или более поздней версии, но верно для 5.3 или менее

 1
Author: monocell, 2014-04-11 10:17:19

Все в порядке, ваши ожидания просто не согласуются с тем, как работает PHP.

Если вы хотите, чтобы значения "заголовок" и "тип" рассматривались как пары, вам нужно каким-то образом сгруппировать их вместе (а не просто "поместить их рядом друг с другом"). Один из способов сделать это - обернуть другой массив вокруг каждой пары, что приведет к ожидаемому результату. Вы уже делаете это для пары Facebook/ввод, поэтому удаление остальных данных дает ожидаемый результат:

$array = array(
  array(
    '#title' => 'Facebook',
    '#type' => 'input',
  )
);
 0
Author: Jon, 2014-04-11 09:50:19