#php #arrays #heredoc
#php #массивы #heredoc
Вопрос:
Я столкнулся со странной проблемой, из-за которой кажется, что я не могу отобразить значение массива, используя синтаксис heredoc:
<?php
$arr = array(
array("string 1"),
array("string 2"),
array("string 3")
);
// string 3
echo $arr[2][0];
// Notice: Array to string conversion
// Var dump: string(8) "Array[0]"
echo <<<EOT
$arr[2][0]
EOT;
Я чувствую, что это то, что я должен знать к настоящему времени, но я не могу найти никаких причин, почему это происходит или как это решить. Кто-нибудь хочет меня просветить?
Ответ №1:
Использование {}
в heredoc:
echo <<<EOT
{$arr[2][0]}
EOT;
вывод:
string 3string 3
Когда дело доходит до наличия ссылки на массив или объект в строке, требуется сложный синтаксический анализ с использованием {}
. Информация по ссылке: (примеры можно найти и там)
Сложный (фигурный) синтаксис
Это называется сложным не потому, что синтаксис сложный, а потому, что он допускает использование сложных выражений.
Любая скалярная переменная, элемент массива или свойство объекта со строковым представлением могут быть включены с помощью этого синтаксиса. Просто напишите выражение так же, как оно будет отображаться вне строки, а затем оберните его в { и } . Поскольку { не может быть экранировано, этот синтаксис будет распознан только тогда, когда $ сразу следует за { . Используйте {$, чтобы получить литерал {$.
Комментарии:
1. Потрясающе! Это действительно решило проблему. Не могли бы вы, возможно, объяснить причину этого? Или укажите мне на документы?
2. Спасибо 🙂 Я ценю вашу помощь. Я собираюсь принять ответ Ника, потому что он будет немного более понятным для будущих посетителей с тем же вопросом. Это единственная причина, по которой вы оба были одинаково полезны для меня.
Ответ №2:
Из примеров в руководстве по PHP по строкам:
// Работает. При использовании многомерных массивов всегда используйте фигурные скобки вокруг массивов
// когда внутри строк
эхо «Это работает: {$arr[‘foo’][3]}»;
Поскольку синтаксис heredoc эквивалентен строке, заключенной в кавычки, вам нужно использовать фигурные скобки вокруг значения:
echo <<<EOT
{$arr[2][0]}
EOT;
Вывод:
string 3
Комментарии:
1. Спасибо! Очень полезно иметь документы об этом 🙂
2. @icecub не беспокойтесь — это можно было бы лучше документировать, немного безумно, что вам нужно прочитать все примеры, чтобы найти его.