Как хранить массив php на стороне клиента? - PullRequest
1 голос
/ 06 апреля 2011

Я извлекаю массив из базы данных 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?

Ответы [ 4 ]

5 голосов
/ 06 апреля 2011

Сериализуйте $ 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).Печенье тоже будет работать.Я избегаю вывода непосредственно в блок скрипта, хотя.Мне не нравится, как мой синтаксический редактор сходит с ума по PHP внутри JS, он часто приводит к большому количеству глобализированного кода, и он мешает мне, когда приходит время переместить скрипт во внешний файл.

Кроме того, если вы предоставляете JSON API для старых браузеров, вы можете заменить $.parseJSON на JSON.parse.

4 голосов
/ 06 апреля 2011

Как насчет хранения его как простого объекта 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.

1 голос
/ 06 апреля 2011

Один из подходов, который мы (наша компания) использовали ранее, заключается в отображении этих данных в виде 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 
0 голосов
/ 06 апреля 2011

На самом деле, есть проблема с этим, и она «небезопасна» (но я оставляю этот ответ для справки, а также для выявления недостатка, который я не рассматривал ранее):

Если на выходе JSON появляется '' (что совершенно законно), то HTML-код недействителен.

РЕДАКТИРОВАТЬ: json_encode принимает необязательный JSON_HEX_TAG, который предотвратит возникновение вышеуказанной ситуации. Обязательно используйте правильные выходные экранированные значения, необходимые для контекста.


(И предыдущие вещи ...)

Я собираюсь дать тот же ответ, что и все остальные ...

... используйте json_encode или аналогичный / лучший механизм кодирования JSON. Это должно привести к JSON - JSON является текстовым представлением подмножества литералов объектов JavaScript . Тогда этот JSON (если не нарушен json_encode) гарантированно будет на 100% допустимым выражением без побочных эффектов в JavaScript .

... с одним исключением: просто используйте действительное-JS-выражение как есть.

# 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"}")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...