[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: JSON функцией json_encode
Xes
Ни могу сообразить как массив данных джейсоном передать. Так чтобывручную не формировать весь текст джейсон.строки

Из бд читаются записи id, namelong .... нескольо штук
Этот список надо передать обратно клиенту.


function show_hotelselect()
{
$hotelselect = $_SESSION['hotelselect']; //Получаю массив hotelselect из сесии в данном случае содержит "1","1","1" три раза один и тот же Id
krsort($hotelselect); переворачиваю
foreach($hotelselect as $key => $val)
{
$query = "SELECT * FROM `hotels` WHERE `idhotel`='".$val."' LIMIT 1";
$sql = @mysql_query($query);
if(@mysql_num_rows($sql)>0)
{
$sqlrow = @mysql_fetch_array($sql);
$hotels['idhotel'][] = $sqlrow['idhotel'];
$hotels['namelong'][] = $sqlrow['namelong'];
//$hotels['adres'][] = $sqlrow['adres'];
//$hotels['telefon'][] = $sqlrow['telefon'];

}
$response_json = '{"gotofunction" : "ShowHotelselect", "hotels" : "'.json_encode($hotels).'"}';
echo $response_json;
}
}


Выводит вот такой текст
[*]{"gotofunction" : "ShowHotelselect", "hotels" : "{"idhotel":["1"],"namelong":["\u041e\u0442\u0435\u043b\u044c \u00ab\u042e\u0436\u043d\u044b\u0439 \u0420\u0430\u0439\u00bb"]}"}{"gotofunction" : "ShowHotelselect", "hotels" : "{"idhotel":["1","1"],"namelong":["\u041e\u0442\u0435\u043b\u044c \u00ab\u042e\u0436\u043d\u044b\u0439 \u0420\u0430\u0439\u00bb","\u041e\u0442\u0435\u043b\u044c \u00ab\u042e\u0436\u043d\u044b\u0439 \u0420\u0430\u0439\u00bb"]}"}{"gotofunction" : "ShowHotelselect", "hotels" : "{"idhotel":["1","1","1"],"namelong":["&a mp;a mp;a mp;a mp;a mp;a mp;# 092;u041e\u0442\u0435\u043b\u044c \u00ab\u042e\u0436\u043d\u044b\u0439 \u0420\u0430\u0439\u00bb","\u041e\u0442\u0435\u043b\u044c \u00ab\u042e\u0436\u043d\u044b\u0439 \u0420\u0430\u0439\u00bb","\u041e\u0442\u0435\u043b\u044c \u00ab\u042e\u0436\u043d\u044b\u0439 \u0420\u0430\u0439\u00bb"]}"}[*]

Так если повторят кучу раз черти че мне же нужен массив типа

{"gotofunction" : "ShowHotelselect", "hotels" : "[{ "idhotel": "2", "namelong": "Имя1"} { "idhotel": "3", "namelong": "Имя3"} { "idhotel": "4", "namelong": "Имя4"}]"}


Если не ошибаюсь так должна выглядить джейсон строка с массивом элементов.

Как нужно создать массив, чтобы json_encode сделал то что мне нужно. Чтобы потом таблицу можно было напечатать.

Хотя можно было бы вернуть готовый кантент с разметкой, но говорят это плохой тон.



Спустя 18 минут, 10 секунд (12.08.2011 - 21:33) fire написал(а):
могу конечно ошибаться, проверить нет возможности сейчас, попробуй так:

$hotels = iconv('windows-1251', 'utf-8', $hotels);
$response_json = '{"gotofunction" : "ShowHotelselect", "hotels" : "'.json_encode($hotels).'"}';

json ведь только в ютф8 работает

Спустя 9 минут, 12 секунд (12.08.2011 - 21:43) Xes написал(а):
Нет, с кодировкой все нормально, я думаю. не в этом проблема у меня все на utf8 и так уже. Тот текст что я привел это содержание ответа сервера.

Это вроди бы нормальный вид руских символов когда обратно буду преврашать в объект все будет ок.

У меня нужную мне структуру создать не получается функцией json_encode.
Ручками точнее средствами объеденения строк в пхп без проблем, а вот из массива одной функцией не соображу как это зделать.


{"gotofunction" : "ShowHotelselect", "hotels" : "[
{ "idhotel": "2", "namelong": "Имя1"}
{ "idhotel": "3", "namelong": "Имя3"}
{ "idhotel": "4", "namelong": "Имя4"}]"}


ТОесть когда я получу джейсон и создам объект. я его в цикле выведу приерно так
Цитата

for (var i=0; i<=rez.hotels.length; i++)
{
вывести свойство rez.hotels.idhotel разметка вывести свойство rez.hotels.namelong
{


Спустя 1 час, 7 минут, 6 секунд (12.08.2011 - 22:50) Nikitian написал(а):

function show_hotelselect()
{
$hotelselect = $_SESSION['hotelselect']; //Получаю массив hotelselect из сесии в данном случае содержит "1","1","1" три раза один и тот же Id
krsort($hotelselect); переворачиваю
$hotels = array('idhotel'=>array(),'namelong'=>array());
foreach($hotelselect as $key => $val)
{
$query = "SELECT * FROM `hotels` WHERE `idhotel`='".$val."' LIMIT 1";
$sql = @mysql_query($query);
if(@mysql_num_rows($sql)>0)
{
$sqlrow = @mysql_fetch_array($sql);
$hotels['idhotel'][] = $sqlrow['idhotel'];
$hotels['namelong'][] = $sqlrow['namelong'];
//$hotels['adres'][] = $sqlrow['adres'];
//$hotels['telefon'][] = $sqlrow['telefon'];

}
}

$response_json = array("gotofunction" => "ShowHotelselect", "hotels" => $hotels);
echo json_encode($response_json);
}

//Поправил, спасибо Michael за внимательность

Спустя 8 часов, 12 минут, 25 секунд (13.08.2011 - 07:02) Michael написал(а):
echo json_encode ... ;надо делать в самом конце один раз(а не в цикле).
Т.е. сформировал объект или массив на php, который хочешь передать, и тогда его уже преобразуешь в json и exit().

Спустя 7 часов, 25 минут, 10 секунд (13.08.2011 - 14:27) Xes написал(а):
Спасибо, красиво все получилось именно как надо.

Сижу пока кумекую, маленький момент, может кто быстрее сообразит.
Обработчик данного ответа.
ResponseParse - это уже объект созданный из джейсон строки.

function ShowHotelselect()
{
alert(ResponseParse.gotofunction);
document.getElementById('list_hotelselect').innerHTML = ResponseParse.hotels.length;
}

Алерт выводит сообщение правельное так если ответ пришел и пришел по адресу в нужную функцию. А вот ResponseParse.hotels.length выводит undefined, соответсвенно цикл я прогнать не могу по массиву чтобы его вывести.
Если выводить document.getElementById('list_hotelselect').innerHTML = ResponseParse.hotels; то пишет что это объет типа объект )

Спустя 18 минут, 1 секунда (13.08.2011 - 14:45) Michael написал(а):
У тебя просто ResponseParse.hotels это наверное не массив, а объект.
Посмотри ответ сервера. hotels: [ или hotels: { прописано?
Для перебора свойств объекта используется это

Спустя 31 минута, 12 секунд (13.08.2011 - 15:17) Xes написал(а):
Да hotels это объект.

function ShowHotelselect()
{
alert(ResponseParse.gotofunction);
for(var hotel in ResponseParse.hotels)
{
document.getElementById('list_hotelselect').innerHTML += hotel;
document.getElementById('list_hotelselect').innerHTML += ResponseParse.hotels.hotel.length;
}
}

НО hotel - "Переменная, которой последовательно присваиваются названия свойств"
Названия свойств я знаю зарание. Как ни кавырял различные комбинации вывести уже массив idhotel и namelong кторые лежат в объекте ResponseParse.hotels не получается, собственно и как попытки определения длены массива.

Спустя 9 минут, 17 секунд (13.08.2011 - 15:26) Xes написал(а):
А не подсказывайте чето вроди начало получатся, доделаю.

Спустя 3 минуты (13.08.2011 - 15:29) Michael написал(а):
Цикл неверный у тебя.
Может так понятней будет:
alert(ResponseParse.hotels.idhotel.length)

должно вывести размер массива, т.к. ResponseParse.hotels.idhotel - это массив, так же само как ResponseParse.hotels.namelong

Спустя 10 минут, 57 секунд (13.08.2011 - 15:40) Xes написал(а):
Спасибо за момощь. Для завершенной целостности поста.

function ShowHotelselect()
{
//alert(ResponseParse.gotofunction);
//alert(ResponseParse.hotels.idhotel);

for(var i=0; i<ResponseParse.hotels.idhotel.length; i++)
{
document.getElementById('list_hotelselect').innerHTML += ResponseParse.hotels.idhotel[i] +
'. <b>' + ResponseParse.hotels.namelong[i] + '</b><br>';
}
}


Вот только дейстивтельно подстраховаться. Нет ли в js цикла на подобии forech в php? Сделать бы перебор через него (на сколько я успел ознакомиться с js вроди нет ни чего такого).
Хотя для моего случая это вообще не актуальный вопрос все прекрасно работает и с индексным массивом.

Спустя 9 минут, 39 секунд (13.08.2011 - 15:49) Michael написал(а):
Нет, форича нету. В js массив - это структура данных(подтип у объекта) в которой к его элементам обращаешься по номеру и их кол-во лежит в length
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.