在 PHP foreach 的脚本中回显 JSON.parse 时如何避免语法错误?

How may I avoid a syntax error when echoing JSON.parse in a script in PHP foreach?

这是我在 Whosebug 上的第一个问题,我认为自己是新手(自学成才)。请多多包涵。

当未包含在 php 标签中时,以下脚本在页面上运行。

<script>
  var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
  for (var k in obj) {
    if (obj[k] instanceof Object) {
      printValues(obj[k]);
    } else {
      document.write(obj[k]);
    };
  }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script>

当包裹在 php 标签中并被回显时,相同的脚本在页面上不起作用。

它实际上使网站崩溃。

下一个代码块中的第二行 var json = '{"submitted_values":{"15":{"15.1":"123"}}}'; 结果为 syntax error, unexpected ':'

<?php echo '<script>
  var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
  for (var k in obj) {
    if (obj[k] instanceof Object) {
      printValues(obj[k]);
    } else {
      document.write(obj[k]);
    };
  }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script>'; ?>

下面描述了我想要开始工作的内容。

测试是一行 table 三列。

下一个代码块中的第 1 列是上面的脚本,当然,它不起作用。

Col 2 有效并生成一个字符串,其中脚本中的 document.write(obj["submitted_values"]["15"]["15.1"]); 有效。我已经测试了一个实际的(精心设计的、嵌套的)字符串,它确实有效,但只有在 php 标签之外时才有效。

第 3 列是上面的脚本,但 '{"submitted_values":{"15":{"15.1":"123"}}}' 替换为 ' . esc_html($incomplete_submission->submission) . '

第 3 列是我最终想在 WordPress 插件中使用的内容。

如果可以的话,有人可以从 echo '<!-- Col 3 --><td><script> 复制下面的代码块,更改代码使其正常工作,然后将其全部粘贴到答案中吗?

我要求把整个东西都贴出来,因为这样可以节省你来回的时间。

谢谢!

<?php
foreach ($incomplete_submissions as $incomplete_submission)
{
 echo '<!-- Row --><tr>';
 echo '<!-- Col 1 --><td><script>
    var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script></td>';
    echo '<!-- Col 2 --><td>' . esc_html($incomplete_submission->submission) . '</td>';
    echo '<!-- Col 3 --><td><script>
    var json = ' . esc_html($incomplete_submission->submission) . ';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script></td>';
    echo '</tr>';
   }
?>

PHP 有 Heredoc 和 Nowdoc 字符串,这是处理 PHP.

中多行字符串的最佳方式

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

您可以使用下面这种类型的字符串来解决您的问题:

<?php echo <<<EOD
    <script>
        var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
        var obj = JSON.parse(json);

        function printValues(obj) {
          for (var k in obj) {
            if (obj[k] instanceof Object) {
              printValues(obj[k]);
            } else {
              document.write(obj[k]);
            };
          }
        };
        printValues(obj);
    </script>
EOD; 
?>

请注意,结束标记 EOD 根本不能缩进,否则 PHP 不会承认它。另外,您不必使用 "EOD";它可以是你想要的任何字符串。

感谢@cbroe 的评论,您可以在自己设置 $myJson 变量后使用下面的代码,并在 wordpress 插件中使用它来解决问题:

<script>
    function printValues(jsonString) {
        var obj = JSON.parse(jsonString);
        for (var k in obj) {
            if (obj[k] instanceof Object) {
                printValues(obj[k]);
            } else {
                document.write(obj[k]);
            };
        }
    };
</script>
<?php
    $myJson = '{"submitted_values":{"15":{"15.1":"123"}}}';
    foreach ($incomplete_submissions as $incomplete_submission)
    {
        ?>
        <tr><!-- Row -->
            <td><!-- Col 1 -->
                <script>
                    var jsonString = <?php echo $myJson; ?>;
                    printValues(jsonString);
                </script>
            </td>
            <td><!-- Col 2 -->
                <?php echo esc_html($incomplete_submission->submission); ?>
            </td>
            <td><!-- Col 3 -->
                <script>
                    var jsonString = <?php echo wp_json_encode($incomplete_submission->submission); ?>;
                    printValues(jsonString);
                </script>
            </td>
        </tr>
        <?php
    }
?>

感谢所有试图提供帮助的人。

这是如何完成的:

echo '<!-- Col 3 --><td>';
?>
<script>
var json = '<?php echo $incomplete_submission->submission; ?>';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]); </script>
<?php
echo '</td>';