【问题标题】:Array to string conversion when using heredoc syntax使用heredoc语法时数组到字符串的转换
【发布时间】:2021-01-04 21:07:19
【问题描述】:

我遇到了一个奇怪的问题,我似乎无法使用 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;

我觉得这是我现在应该知道的事情,但我找不到发生这种情况的任何原因或如何解决它。有谁愿意赐教?

【问题讨论】:

    标签: php arrays heredoc


    【解决方案1】:

    在 heredoc 中使用 {}

    echo <<<EOT
    {$arr[2][0]}
    EOT;
    

    输出:

    string 3string 3
    

    当涉及到在字符串中有数组或对象引用时,需要使用complex parsing 使用{}。链接中的信息:(也可以在那里找到示例)

    复杂(卷曲)语法

    这不是因为语法复杂,而是因为 它允许使用复杂的表达式。

    任何标量变量、数组元素或带有字符串的对象属性 可以通过此语法包含表示。简单地写 表达方式与它出现在字符串之外的方式相同,并且 然后将其包装在 { 和 } 中。由于 { 无法转义,因此此语法将 仅当 $ 紧跟 { 时才被识别。使用 {$ 到 得到一个字面量 {$.

    【讨论】:

    • 太棒了!这确实解决了问题。你能解释一下这背后的原因吗?或者指向我的文档?
    • 谢谢 :) 感谢您的帮助。我将接受尼克的回答,因为未来有相同问题的访问者会更清楚。这是唯一的原因,你们两个对我同样有帮助。
    【解决方案2】:

    来自Strings 上的 PHP 手册中的示例:

    // 有效。使用多维数组时,请始终在数组周围使用大括号
    // 当在字符串内部时
    echo "这行得通:{$arr['foo'][3]}";

    由于heredoc语法等价于带引号的字符串,因此需要在值周围使用大括号:

    echo <<<EOT
    {$arr[2][0]}
    EOT;
    

    输出:

    string 3
    

    Demo on 3v4l.org

    【讨论】:

    • 谢谢!获得有关此的文档非常有帮助:)
    • @icecub 不用担心 - 它可以更好地记录下来,您必须通读所有示例才能找到它,这有点疯狂。
    猜你喜欢
    • 2013-06-09
    • 2018-10-09
    • 2021-05-03
    • 2020-05-04
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多