Я вытаскиваю массив из базы данных mysql. Довольно простой оператор select
который затем помещается в ваш многомерный массив (строки и столбцы) для генерации некоторого HTML. Все идет нормально.
Я хочу иметь возможность хранить этот массив где-нибудь (DOM?) На стороне клиента, чтобы клиенты могли повторно использовать и манипулировать этими данными (через jQuery) без необходимости повторно запрашивать базу данных для тех же данных каждый раз.
Итак … скажем, мой php-массив:
$fruits = array ( "fruits" => array ( "a" => "orange", "b" => "banana", "c" => "apple" ), "numbers" => array ( 1, 2, 3, 4, 5, 6 ), "holes" => array ( "first", 5 => "second", "third" ) );
Как сохранить $fruits
на стороне клиента, чтобы я мог повторно использовать данные в команде через javascript?
Как сохранить его как простой объект javascript? Что-то вроде следующего:
//yourphpfile.php <script type="text/javascript"> var obj = JSON.parse('<?php echo json_encode($my_arr,JSON_HEX_TAG|JSON_HEX_APOS); ?>'); console.log(obj); </script>
Клиентская сторона будет иметь все данные в объекте obj
.
Сериализуйте $ fruits в JSON с помощью json_encode , а затем напишите его на что-то вроде скрытого ввода. Используя jQuery, вы можете запросить DOM для ввода и $ .parseJSON его значение.
Серверная сторона:
<input type="hidden" id="FruitData" value="<?php echo htmlentities( json_encode( $fruits ) );?>" />
Сторона клиента:
var fruits = $.parseJSON( $( '#FruitData' ).val() );
Вы можете поместить его в любом месте, на самом деле – я просто предпочитаю вход. Входы удобны для доставки данных обратно на сервер (даже с помощью методов, отличных от AJAX). Cookies тоже будут работать. Однако я избегаю вывода непосредственно в блок сценариев. Мне не нравится, как мой редактор синтаксиса выстраивается на PHP внутри JS, он часто приводит к большому количеству глобализованного кода, и он мешает мне при переходе сценария во внешний файл.
Кроме того, если вы предоставляете JSON API старым браузерам, вы можете заменить $.parseJSON
на JSON.parse
.
Один из подходов и тот, который мы (наша компания) использовали раньше, – это эхо-данные этих данных как JSON в скрытом div
на странице. Затем используйте комбинацию метода jQuery .text()
и JSON.parse()
чтобы получить данные как JSON на стороне клиента.
Что-то вроде этого:
echo "<div id = 'fruits' style = 'display:none;'>".json_encode($fruits)."</div>";
Затем в Javascript:
var fruits = JSON.parse($("#fruits").text()); console.log(fruits.fruits.a); // orange
На самом деле, есть проблема с этим и быть «небезопасным» (но я оставляю этот ответ для справки, а также раскрывая недостаток, который я не рассматривал ранее):
Если в выводе JSON (который совершенно легален) появляется «</ script>», то HTML недействителен.
EDIT: json_encode
использует необязательный JSON_HEX_TAG
который предотвратит JSON_HEX_TAG
ситуацию. Обязательно используйте правильные выходные экраны, необходимые для контекста.
(И предыдущие вещи …)
Я собираюсь процитировать тот же ответ, что и все остальные …
… используйте json_encode
или аналогичный / лучший механизм кодирования JSON. Это должно привести к тому, что JSON- JSON представляет собой текстовое представление подмножества литературных объектов JavaScript . Затем этот JSON (если json_encode не работает) гарантированно является 100% -ным действительным безболезненным выражением в JavaScript .
… за одним исключением: просто используйте выражение-valid-JS as-is.
# Look, no added nonsense. var blah = <?= json_encode($my_arr); ?>;
Очень маловероятно, что JSON нужно будет засунуть в свойство элемента перед использованием с хорошим дизайном. (Например, вероятно, нет необходимости в каком-либо «анализе» из хранимого значения, используйте JavaScript и порядок выполнения между внутренним и внешними в испускающем коде.)
Пожалуйста, найдите время, чтобы подумать о разных этапах обработки. Например, неверно следующее :
var blah = ParseJson("<?= json_encode($my_arr); ?>;")
Это неправильно, поскольку после запуска PHP результирующий HTML, возвращаемый в браузер, может быть:
var blah = ParseJson("{"hello": "world"}")
Счастливое кодирование