Преобразование массива в строку при использовании синтаксиса heredoc

#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
  

Демонстрация на 3v4l.org

Комментарии:

1. Спасибо! Очень полезно иметь документы об этом 🙂

2. @icecub не беспокойтесь — это можно было бы лучше документировать, немного безумно, что вам нужно прочитать все примеры, чтобы найти его.