在 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>';
这是我在 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>';