Как сохранить php-массив на стороне клиента?

Я вытаскиваю массив из базы данных 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"}") 

Счастливое кодирование