Передача массива из Php в Javascript
Как лучше удобней передать массив php в javascript? Без Ajax и cookie.
|
Сложно что ли на php сформировать для js массив вида: [2,3,4] ?
|
echo '<script>var a = ['.implode(",",$arr).']</script>'; |
|
Всем спасибо!
У меня получилось вот так var Voprosi=[<?php foreach ($Voprosi as $value)// переводит массивы из php в javascript echo '"'.$value.'",'; ?>]; |
kamushek,
за такой код вам добавят кармы на говнокод.ру =) |
плюс из-за запятой в конце списка эл-тов массива длина js массива будет отличаться в разных браузерах.
|
)) echo '<script>var a = ['.implode(",",$arr).']</script>'; вот так правильней!?
|
kamushek,
прокатит, если в массиве числа. |
Цитата:
|
DooMer,
не нужно повторяться, каждый использует то, что хочет. |
json_encode однозначно :)
|
igrok,
зуб дашь? |
это конечно ИМХО, может что еще существует, но для человека, который в данный момент не знает как правильно поступить я считаю что данное решение будет самым простым и удобным, а насчет повторяться - когда я к примеру что либо ищу по форумам и вижу что много людей отвечает одинаково, то это говорит о том что решение "работает" и его как минимум можно использовать:)
|
igrok, если массив цифровой то использовать нужно implode, потому что он в десятки, а то и в сотни раз быстрее, иногда это очень критично и не нужно тут демагогию разводить.
|
Цитата:
$arr = array(); $i=0; while($i<10000000){ $arr[$i++] = rand(1,1000); } $time1 = time(); $json1 = '['.implode(",",$arr).']'; $time1 =time()-$time1; echo "time1 = $time1 \n"; $time2 = time(); $json2 = json_encode($arr); $time2 =time()-$time2; echo "time2 = $time2 \n"; результат time1 = 359 time2 = 56 Так что действительно, давайте не будем разводить демагогию |
А как лучше из PHP в Javascript передать массив строк?
И как красиво передать массив чисел обратно от клиента серверу? |
Цитата:
$strings = array('blabla', 'bebebe', 'hahaha'); echo json_encode( $strings ); Цитата:
|
Спасибо. А когда строковый массив большой, данные изначально неизвестны и исходно передаются в массив, например, из базы данных? То-есть нужно передать массив строк с сервера в массив Javascript клиента.
Применять перебор? |
а зачем передавать огромный массив, передавай только то что нужно... делай выборку нужных строк из базы и отравляй клиенту. Все то клиенту совать не нужно.
|
Т.е на стороне сервера сформировать массив из выборки и потом через json_encode передать этот массив клиенту? Или можно обойтись без формирования массива из выборки на стороне сервера и передавать выборку каким-то образом напрямую в массив клиента?
|
У меня через json_encode не передаются русские строки. Это можно решить?
|
Цитата:
rawurlencode iconv |
Спасибо. Дело было действительно в кодировке БД. iconv выручил. В "исходном" тексте после передачи русской строки в JS отсутствовали двойные кавычки. Может быть, есть смысл просто их подставлять без перекодирования?
|
Я внёс бы поправку в код: нельзя забывать про кавычки при implode, это касается строковых значений массива:
<script>var a=['<?=implode("','",$arr)?>'];</script> |
Есть несколько решений, например вот
<?php function json_fix_cyr($json_str) { $cyr_chars = array ( '\u0430' => 'а', '\u0410' => 'А', '\u0431' => 'б', '\u0411' => 'Б', '\u0432' => 'в', '\u0412' => 'В', '\u0433' => 'г', '\u0413' => 'Г', '\u0434' => 'д', '\u0414' => 'Д', '\u0435' => 'е', '\u0415' => 'Е', '\u0451' => 'ё', '\u0401' => 'Ё', '\u0436' => 'ж', '\u0416' => 'Ж', '\u0437' => 'з', '\u0417' => 'З', '\u0438' => 'и', '\u0418' => 'И', '\u0439' => 'й', '\u0419' => 'Й', '\u043a' => 'к', '\u041a' => 'К', '\u043b' => 'л', '\u041b' => 'Л', '\u043c' => 'м', '\u041c' => 'М', '\u043d' => 'н', '\u041d' => 'Н', '\u043e' => 'о', '\u041e' => 'О', '\u043f' => 'п', '\u041f' => 'П', '\u0440' => 'р', '\u0420' => 'Р', '\u0441' => 'с', '\u0421' => 'С', '\u0442' => 'т', '\u0422' => 'Т', '\u0443' => 'у', '\u0423' => 'У', '\u0444' => 'ф', '\u0424' => 'Ф', '\u0445' => 'х', '\u0425' => 'Х', '\u0446' => 'ц', '\u0426' => 'Ц', '\u0447' => 'ч', '\u0427' => 'Ч', '\u0448' => 'ш', '\u0428' => 'Ш', '\u0449' => 'щ', '\u0429' => 'Щ', '\u044a' => 'ъ', '\u042a' => 'Ъ', '\u044b' => 'ы', '\u042b' => 'Ы', '\u044c' => 'ь', '\u042c' => 'Ь', '\u044d' => 'э', '\u042d' => 'Э', '\u044e' => 'ю', '\u042e' => 'Ю', '\u044f' => 'я', '\u042f' => 'Я', '\r' => '', '\n' => '<br />', '\t' => '' ); foreach ($cyr_chars as $cyr_char_key => $cyr_char) { $json_str = str_replace($cyr_char_key, $cyr_char, $json_str); } return $json_str; } echo json_fix_cyr(json_encode(array("собака","кошка"))); // ["собака","кошка"] ?> |
Ъь_,
Господи, это что? А что встроенные возможности PHP вдруг перестали работать? |
Теперь понадобилось вернуть достаточно большой массив обратно из js в php. GET уже не проходит по длине адресной строки. Есть ли способ передать массив целиком, а не поэлементно?
Если этот массив получится вернуть целиком, то хотелось бы засунуть его в SQL запрос в php: SELECT * FROM DB.simple WHERE ind IN ... Можно ли после IN поставить в строке запроса полученный массив, назовем его к примеру $arr? Тогда какова должна быть внутренняя структура такого массива? |
Цитата:
$query = 'SELECT * FROM DB.simple WHERE ind IN (' . implode(",", $arr) . ')'; |
Спасибо. Скорее всего получится работать с SQL и через json_encode. Остается еще вопрос, как передать массив на сервер с помощью POST, желательно без JQuery. Вроде надо использовать JSON в JS, тем более, что JSON поддерживают современные браузеры. Поле, понятно, hidden, но как именно подставить в value массив?
|
Цитата:
|
Цитата:
|
Цитата:
|
ну в противном случае хотябы так прогнали бы:
implode( ',', array_map( 'mysql_real_escape_string', $arr ) )Куда меньше возможностей сделать инъекцию. |
Цитата:
Цитата:
Цитата:
select * from ...это быдло-запрос))) |
Цитата:
|
Что-нибудь в этом роде будет работать?
<INPUT type = "hidden" name = "Yes" value=<script>JSON.stringify(arr)</script>> |
Цитата:
|
Цитата:
|
Сейчас проверил на другом примере: JSON работает в firefox, в IE нет.
|
Часовой пояс GMT +3, время: 17:48. |