将PHP数组值推入JavaScript数组?

时间:2017-09-16 17:41:53

标签: javascript php blockly

我正在与Blockly合作制作一些Block。当我制作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 token JavaScript错误。当我查看源代码时,它显示错误与此行相关:obj.push并且它显示obj.push('<br /> <b>Notice</b>: Array to string conversion in <b>myPhp.php</b> on line <b>20</b><br /> Array');

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

答案 2 :(得分:1)

让你开始的一些事情:

  • JSON是“ JavaScript 对象表示法”。尽管它在许多其他语言中使用,但JavaScript本身也能理解它。

    这意味着一旦你有了一个JSON字符串,就可以直接从中获取一个JavaScript对象。如果JSON字符串表示单个对象,则您将获得单个JavaScript对象。如果它代表一个数组,你将获得一个JavaScript对象的JavaScript数组。如果它是一些嵌套结构,那么你就会得到它。在现代浏览器中,您只需在JavaScript端is JSON.parse(...)上完成魔术。

  • 要将JSON引入JavaScript,请执行以下操作:

    • 直接在JavaScript中使用using XMLHttpRequest或jQuery $.get等帮助程序。这将需要你理解一些异步编程,所以可能确实下面的一个更容易开始:

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

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

    • 使用PHP获取它,使用Jim's simple solution将其转换为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错误(原因解释为in Osama's answer),这会产生无效的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");

但总的来说,你可能不知道你得到了什么价值,所以you need to "escape"麻烦的角色。

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

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

在上面,您需要处理JSON已经添加的用于转义的反斜杠。所以PHP's addslashes 可能做,公交车我没有测试过这个:

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

否则,当首次使用$datajson_decode解析为PHP对象时(或者甚至不执行此操作时!),Jim's simple solution当然是首选。