2

我正在与 Blockly 合作制作一些 Blocks。当我制作 Blockly Blocks 时,所有的错误都出现了。有没有人知道为什么我的代码在 Blockly 中不起作用?

我有一个包含一组 JSON 代码的 URL。我使用以下方法在 myPhp.php 文件中获取了内容:

$data = file_get_contents("URL");

然后,我使用以下方法解码数据:

$objects = json_decode($data, true);

$objects包含:

[0] => Array
        (
            [name] => Light
            [x] => 5
            [h] => 5
            [y] => 5
            [status] => on
        )

现在我想使用以下方法将这个数据数组推送到 JavaScript 数组中:

<script type="text/javascript">
    var obj = new Array();
    <?php 
     foreach($objects as $key => $value){ 
    ?>
    obj.push('<?php echo $value; ?>');
    <?php } ?>
</script>

并且$value需要拥有所有这些数据。

但我收到Invalid or unexpected tokenJavaScript 错误。当我查看源代码时,它显示错误与这一行有关:obj.push它说obj.push('<br /> <b>Notice</b>: Array to string conversion in <b>myPhp.php</b> on line <b>20</b><br /> Array');.

4

3 回答 3

2

而不是通过数组循环甚至解码它的麻烦(除非有特定的原因这样做),只需使用json_encode. JSON 是 JavaScript 的原生语言,所以它会理解它。

<?php 
$data = json_decode(file_get_contents("URL"));
?><script type="text/javascript"><?php
    // echo out JSON encoded $data or a string of '[]' (empty JS array) if it is a false value (error occured with json_decode)
    ?>var obj = <?= json_encode($data) | '[]' ?>;<?php
    // In JavaScript "Light" is available as obj[0].name or it does not exist (empty array if an error occured with json_encode or json_decode)
?></script>
于 2017-09-17T13:55:49.407 回答
2

你的 $value 本身是一个数组,这里你的 $key 是 0。

$密钥

 [0] => 

$价值

 Array
    (
        [name] => Light
        [x] => 5
        [h] => 5
        [y] => 5
        [status] => on
    )

所以你需要另一个 $value 循环来获取每个值,就像这样

<script type="text/javascript">
 var obj = new Array();
<?php 
 foreach($objects as $key => $value){ 
   foreach($value as $key1 => $value1){
 ?>
 obj.push('<?php echo $value1; ?>');
 <?php } }?>
</script>
于 2017-09-17T11:50:51.347 回答
1

让你开始的几件事:

  • JSON 是“ JavaScript对象表示法”。尽管它用于许多其他语言,但 JavaScript 本身就可以理解它。

    这意味着一旦你得到一个 JSON 字符串,你就可以直接从中得到一个 JavaScript 对象。如果 JSON 字符串表示单个对象,您将获得一个 JavaScript 对象。如果它表示一个数组,您将获得一个 JavaScript 对象的 JavaScript 数组。如果它是一些嵌套结构,那么你会得到它。在现代浏览器中,JavaScript 端所需要的只是 JSON.parse(...)来发挥作用。

  • 要将 JSON 转换为 JavaScript,可以:

    • 使用 XMLHttpRequest或 jQuery 的$.get等帮助程序直接在 JavaScript 中获取它。这将需要您了解一些异步编程,因此可能确实以下其中一项更容易开始:

    • 在 PHP 中获取它,像您在问题中尝试的那样解析它,然后生成正确的 JavaScript 以再次创建 JavaScript 对象或数组。请注意,PHPjson_decode会为您提供一些关联数组,然后您需要将其映射到 JavaScript 对象。

    • 在 PHP 中获取它,根本不解析它,只需将 JSON 字符串转发到 JavaScript 并在那里解析它,使用JSON.parse.

    • 在 PHP 中获取它,使用Jim 的简单解决方案将其转化为 JavaScript。

在 PHP 中生成 JavaScript 时,需要注意字符串值中的引号、换行符和其他特殊字符。就像 JSON 是:

{"quote": "She said: 'Beware', and walked off"}

...那么你不能只是将文本连接起来obj.push('...'),因为这会创建无效的 JavaScript:

obj.push('She said: 'Beware', and walked off');

上面,JavaScript 不知道如何处理第二个单引号后的文本,并抛出Uncaught SyntaxError: missing ) after argument list. 同样,换行符可能很麻烦,例如在生成 JavaScript 时意外收到 PHP 错误(原因在 Osama 的回答中解释),这将产生无效的 JavaScript 并抛出Invalid or unexpected token

obj.push('<br />
<b>Notice</b>: Array to string conversion
in <b>myPhp.php</b> on line <b>20</b><br /> Array');

在上面的 JSON 示例中,您可以在 , 中使用双引号obj.push("...")来生成:

obj.push("She said: 'Beware', and walked off");

但一般来说你可能不知道你得到了什么值,所以你需要“转义”麻烦的字符。

我对 PHP 知之甚少,不知道转义字符串的最佳方法是什么。由于(有效)JSON 使用双引号,它应该已经在需要时转义了双引号。因此,JSON 字符串可能如下所示:

{"quote": "She said: \"Beware\", and walked off.\n\nWe'll remember her."}

在上面,您需要注意 JSON 已经添加用于转义的反斜杠。所以PHP的addslashes 可能会做,总线我没有测试这个:

<script type="text/javascript">
  var obj = JSON.parse("<?= addslashes($data) ?>");
</script>

否则,当第一次使用解析$data为 PHP 对象json_decode时(或者甚至不这样做!),Jim 的简单解决方案当然是首选。

于 2017-09-17T13:58:47.650 回答