Вставить значения массива PHP в массив JavaScript?

Я работаю с Blockly, чтобы сделать несколько блоков. Все ошибки возникли, когда я делаю блочные блоки. Есть ли кто-нибудь, кто знает, почему мой код не работает в Blockly?

У меня есть URL, включая набор кода JSON. Я получил содержимое в файле 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 ответа

Решение

Ваше значение $value является массивом, а здесь ваш ключ $ равен 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>

Вместо того, чтобы преодолевать трудности циклического перемещения по массиву или даже его декодирования (если для этого нет особых причин), просто используйте 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>

Несколько вещей, с которых можно начать:

  • JSON - это " JavaScript Object Notation". Хотя он используется во многих других языках, JavaScript понимает его изначально.

    Это означает, что, получив строку JSON, вы можете напрямую извлечь из нее объект JavaScript. Если строка JSON представляет отдельный объект, вы получите один объект JavaScript. Если он представляет массив, вы получите массив JavaScript объектов JavaScript. Если это какая-то вложенная структура, то вы получите именно это. В современном браузере все, что вам нужно на стороне JavaScript, это JSON.parse(...), чтобы творить чудеса.

  • Чтобы получить JSON в JavaScript, либо:

    • Получите его в JavaScript напрямую, используя XMLHttpRequest или помощников, таких как jQuery's $.get. Это потребует от вас понимания некоторого асинхронного программирования, поэтому, возможно, действительно легче начать с одного из следующих:

    • Получите его в PHP, проанализируйте, как вы пытались в своем вопросе, а затем сгенерируйте правильный JavaScript, чтобы снова создать объект или массив JavaScript. Обратите внимание, что PHP json_decode получает некоторый ассоциативный массив, который затем необходимо сопоставить с объектом JavaScript.

    • Получить его в PHP, не анализировать его вообще, а просто переслать строку JSON в JavaScript и проанализировать его там, используя JSON.parse,

    • Получите его на PHP, используйте простое решение Джима, чтобы включить его в JavaScript.

При генерации JavaScript в PHP вы должны быть осторожны с кавычками, символами новой строки и другими специальными символами в строковых значениях. Например, если 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, Аналогичным образом, переносы строк могут вызывать проблемы, например, при неожиданном получении ошибки PHP при генерации JavaScript (по причинам, объясненным в ответе Усамы), что приведет к неверному 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, но я не проверял это:

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

Иначе при первом разборе $data в объект PHP с помощью json_decode (или даже не делая этого!), простое решение Джима, безусловно, предпочтительнее.

Другие вопросы по тегам