Ключ фунта/хэш-ключ/хэштег в массивах 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 / Оба результата одинаковы.
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 или менее
Все в порядке, ваши ожидания просто не согласуются с тем, как работает PHP.
Если вы хотите, чтобы значения "заголовок" и "тип" рассматривались как пары, вам нужно каким-то образом сгруппировать их вместе (а не просто "поместить их рядом друг с другом"). Один из способов сделать это - обернуть другой массив вокруг каждой пары, что приведет к ожидаемому результату. Вы уже делаете это для пары Facebook/ввод, поэтому удаление остальных данных дает ожидаемый результат:
$array = array(
array(
'#title' => 'Facebook',
'#type' => 'input',
)
);