Как можно избежать синтаксической ошибки при выводе JSON .parse в сценарии в PHP foreach? - PullRequest
1 голос
/ 24 февраля 2020

Это мой первый вопрос о StackOverflow, и я считаю себя новичком (самоучка). Пожалуйста, потерпите меня.

Следующий скрипт работает на странице, когда не обернут в 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>'; ?>

Ниже описано, что я хочу получить.

Тест представляет собой одну строку таблицы с тремя столбцами.

Столбец 1 в следующем блоке кода представляет собой сценарий сверху и, конечно, не работает.

Col 2 работает и приводит к строке, где document.write(obj["submitted_values"]["15"]["15.1"]); в сценарии работает. Я проверил фактическую (сложную, вложенную) строку, и она работает, но только когда вне тегов php.

Col 3 - сценарий сверху, но с '{"submitted_values":{"15":{"15.1":"123"}}}' заменен на ' . esc_html($incomplete_submission->submission) . '.

Col 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>';
   }
?>

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020

благодаря комментарию @cbroe, вы можете использовать приведенный ниже код после установки переменной $ my Json со своей собственной и использовать ее в плагине 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
    }
?>
0 голосов
/ 26 февраля 2020

Спасибо всем, кто пытался помочь.

Вот как это делается:

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>';
0 голосов
/ 24 февраля 2020

PHP имеет строки Heredo c и Nowdo c, которые являются лучшим способом обработки многострочных строк в PHP.

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

Вы можете решить эту проблему, используя строку этого типа, как показано ниже:

<?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»; это может быть любая строка, которую вы хотите.

...