Из бд читаются записи 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 написал(а):
могу конечно ошибаться, проверить нет возможности сейчас, попробуй так:
json ведь только в ютф8 работает
$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.
Ручками точнее средствами объеденения строк в пхп без проблем, а вот из массива одной функцией не соображу как это зделать.
ТОесть когда я получу джейсон и создам объект. я его в цикле выведу приерно так
Это вроди бы нормальный вид руских символов когда обратно буду преврашать в объект все будет ок.
У меня нужную мне структуру создать не получается функцией 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().
Т.е. сформировал объект или массив на php, который хочешь передать, и тогда его уже преобразуешь в json и exit().
Спустя 7 часов, 25 минут, 10 секунд (13.08.2011 - 14:27) Xes написал(а):
Спасибо, красиво все получилось именно как надо.
Сижу пока кумекую, маленький момент, может кто быстрее сообразит.
Обработчик данного ответа.
ResponseParse - это уже объект созданный из джейсон строки.
Алерт выводит сообщение правельное так если ответ пришел и пришел по адресу в нужную функцию. А вот ResponseParse.hotels.length выводит undefined, соответсвенно цикл я прогнать не могу по массиву чтобы его вывести.
Если выводить document.getElementById('list_hotelselect').innerHTML = ResponseParse.hotels; то пишет что это объет типа объект )
Сижу пока кумекую, маленький момент, может кто быстрее сообразит.
Обработчик данного ответа.
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: { прописано?
Для перебора свойств объекта используется это
Посмотри ответ сервера. hotels: [ или hotels: { прописано?
Для перебора свойств объекта используется это
Спустя 31 минута, 12 секунд (13.08.2011 - 15:17) Xes написал(а):
Да hotels это объект.
НО hotel - "Переменная, которой последовательно присваиваются названия свойств"
Названия свойств я знаю зарание. Как ни кавырял различные комбинации вывести уже массив idhotel и namelong кторые лежат в объекте ResponseParse.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 написал(а):
Цикл неверный у тебя.
Может так понятней будет:
должно вывести размер массива, т.к. ResponseParse.hotels.idhotel - это массив, так же само как ResponseParse.hotels.namelong
Может так понятней будет:
alert(ResponseParse.hotels.idhotel.length)
должно вывести размер массива, т.к. ResponseParse.hotels.idhotel - это массив, так же само как ResponseParse.hotels.namelong
Спустя 10 минут, 57 секунд (13.08.2011 - 15:40) Xes написал(а):
Спасибо за момощь. Для завершенной целостности поста.
Вот только дейстивтельно подстраховаться. Нет ли в js цикла на подобии forech в php? Сделать бы перебор через него (на сколько я успел ознакомиться с js вроди нет ни чего такого).
Хотя для моего случая это вообще не актуальный вопрос все прекрасно работает и с индексным массивом.
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