Перебор двухмерного массива
Здравствуйте!
Есть задача: при помощи ajax получать записи из бд Mysql. Сайт работает на codeigniter. $('#TestPrivet1').click(function(){ var param = $('#pole1').val(); $.ajax({ type: 'POST', url: 'http://masterstvo-zhizni.loc/index.php/seminars/showAjax', data: {'param':param}, cache: false, dataType: 'json', success: function(data) { $('#result1').html('<table class="raspisanie_sem"><tr class="one"><td>Дата проведения</td><td>Город</td><td>Организатор</td><td>Тема</td></table>'); for ( var key1 in data['dataAjax'] ) { for ( var key2 in data['dataAjax'][key1] ) { $('#result1').append('<tr class="tbody"><td>' + data['dataAjax'][key1]['date']+ '</td><td>'+ data['dataAjax'][key1]['gorod']+'</td><td class="cursiv">'+ data['dataAjax'][key1]['fio']+ data['dataAjax'][key1]['telefon']+data['dataAjax'][key1]['email']+'</td><td class="bold_td">'+data['dataAjax'][key1]['zagolovok']+'</td></tr>'); } } } });//конец ajax });//конец клик });//конец ready Контроллер: public function showAjax(){ $param = $this->input->post('param'); $data = array(); $data['dataAjax'] = $this->raspisanie_model->get_one($param); // Возвращаем ответ echo json_encode($data); } Запрос к базе: public function get_one($seminar_id) { $this->db->select(' raspisanie.date , organizator.gorod , organizator.fio , organizator.email , organizator.telefon , seminars.zagolovok'); $this->db->from('raspisanie'); $this->db->join('seminars', 'raspisanie.seminar_id = seminars.seminar_id'); $this->db->join('organizator', 'raspisanie.organizator_id = organizator.organizator_id'); $this->db->where('raspisanie.seminar_id',$seminar_id); $query = $this->db->get(); return $query->result_array(); } Проблема в следующем: данные вставляются, но почему то приходит три строки. А при переборе массива каждая строка выводится на сайте по 6 раз.т.е. вместо 3-х нужных, получаю 18 строк в таблице на сайте. firebug: dataAjax [Object { date="7-8-9 декабря 2012г.", gorod="Рязань", fio="Елена ", ещё...}, Object { date="14-15-16 декабря", gorod="Воронеж", fio="Фарида и Александр" , ещё...}, Object { date="2-3 февраля", gorod="Одесса", fio="Татьяна " , ещё...}] 0 Object { date="7-8-9 декабря 2012г.", gorod="Рязань", fio="Елена " , ещё...} 1 Object { date="14-15-16 декабря", gorod="Воронеж", fio="Фарида и Александр", ещё...} 2 Object { date="2-3 февраля", gorod="Одесса", fio="Татьяна " , ещё...} |
у тебя явно косяк внутри двух циклов где формируется HTML полученных данных, думаю ряды <tr> нужно формировать в первом цикле ( вне второго короче) а уже столбцы <td> добавлять внутри второго цикла,
в общем у тебя логическая ошибка тут что-то вроде того success: function(data) { $('#result1').html('<table class="raspisanie_sem"><tr class="one"><td>Дата проведения</td><td>Город</td><td>Организатор</td><td>Тема</td></table>'); var html='' for ( var key1 in data['dataAjax'] ) { html+='<tr class="tbody">' for ( var key2 in data['dataAjax'][key1] ) { html+='<td>'+data['dataAjax'][key1][key2]+'</td>' } html+='</tr>' } $('#result1').append(html) } // отпишись как помозгуешь |
Спасибо тебе огромное! щас выводит правильно. Только три строки. Но, в разных ячейках
|
Есть ещё вопрос:
Щас он выводит каждый элемент в отдельную ячейку, т.е получается 6-ть ячеек, а в шапке 4-ре А мне нужно: первый элемент: data['dataAjax'][key1]['date'] в отдельной ячейке второй элемент: data['dataAjax'][key1]['gorod'] в отдельной ячейке третий и четвертый и пятый вывести в одной ячейке: data['dataAjax'][key1]['fio']; data['dataAjax'][key1]['telefon']; data['dataAjax'][key1]['email'] шестой data['dataAjax'][key1]['zagolovok'] в отдельной ячейке function(data) { $('#result1').html('<table class="raspisanie_sem"><tr class="one"><td>Дата проведения</td><td>Город</td><td>Организатор</td><td>Тема</td></table>'); var html='' for ( var key1 in data['dataAjax'] ) { html+='<tr class="tbody">' for ( var key2 in data['dataAjax'][key1] ) { html+='<td>'+data['dataAjax'][key1]['date']+'</td>'+'<td>'+data['dataAjax'][key1]['gorod']+'</td>'+'<td>'+data['dataAjax'][key1]['fio']+data['dataAjax'][key1]['telefon']+data['dataAjax'][key1]['email']+'</td>'+'<td>'+data['dataAjax'][key1]['zagolovok']+'</td>'; } html+='</tr>' } $('#result1').append(html) } Щас выводит три строки, но теперь повторяет столбцы. Т.е первый проход цикла 4-ре столбца , потом опять 4-ре столбца и т.д. |
success: function(data) { $('#result1').html('<table class="raspisanie_sem"><tr class="one"><td>Дата проведения</td><td>Город</td><td>Организатор</td><td>Тема</td></table>'); var html='',count for ( var key1 in data['dataAjax'] ) { count=0 html+='<tr class="tbody">' for (var key2 in data['dataAjax'][key1] ) {count++ if (count<4||count==6){html+='<td>'} html+=data['dataAjax'][key1][key2] if (count<3||count>4){html+='</td>'} } html+='</tr>' } $('#result1').append(html) } // что-то вроде того проверь там |
Изящно, Зачёт! Сработало. Вывел три строки в каждой по 4-ре ячейки
|
Здравствуйте! Понимаю, что теме уже >4 лет, но столкнулась с абсолютно идентичной проблемой, так что даже зарегистрировалась на форуме и вышла из режима readonly :D
success: function (data) { list = JSON.parse(data); var html = ""; for (var key1 in list['list']) { html+='<a class = "link" onclick="event.preventDefault()">'; for (var key2 in list['list'][key1]) { //i++; // console.log(i); html +='<li class = "big" onclick="findList(' + (+key1 + 1) + ')">' + list['list'][key1]["ima"] + " \(" + list['list'][key1]["count(marker.district)"] + "\)</li>"; //console.log(list['list'][key1]["ima"]); } html+='</a>'; }; html+='<a class = "link" onclick="event.preventDefault()"><li class = "big" onclick="findList('+list.allLIST['count(*)']+")>Все районы" + " \(" + list.allLIST['count(*)'] + "\)</li></a>"; console.log(html); $("ul.list").html(html); } Прочитав ответ от bushstas, выполнила его совет. В итоге все равно выводит по три строки в один <li>. А list.allLIST['count(*)'] вообще выдает undefined. Помогите пожалуйста, кто сможет. Уже три дня бьюсь головой о клаву... Заранее спасибо! |
Цитата:
|
Цитата:
Запросы к базе и тд. не предоставила, потому как объект (массив) практически идентичен с объектом автора темы. |
Navka1, начнем с того, что в тег <a> не стоит "вставлять" теги <li>...
Для анализа циклов бывает достаточно просто выводить то, с чем имеешь дело в самом цикле. Обычно это многое проясняет... ;) |
Цитата:
О теге <a> учту, но console.log(list['list'][key1]["ima"]) показывает так же 3 строки... |
Цитата:
Цикл-то у тебя идет не по list['list'][key1]["ima"] а по Цитата:
list['list'][key1][key2] |
Цитата:
|
Цитата:
Т.к. лучший вариант это сделать тестовый пример на котором можно что-то показать... А у вас просто куски какого-то не работающего кода. |
Цитата:
|
Есть запрос к БД:
$qr_result = mysql_query("select ket.district.id, ket.district.ima, count(marker.district) from district left join ket.marker on ket.marker.district = ket.district.ima group by district ORDER BY id;"); $qr_result2 = mysql_query("SELECT count(*) FROM `marker`;") or die(mysql_error()); $list = array(); //$alllist = array(); while($r = mysql_fetch_assoc($qr_result)) { $list['list'][] = $r; }; while($d = mysql_fetch_assoc($qr_result2)) { $list['allLIST'][] = $d; }; echo json_encode($list); //echo json_encode($alllist); ?> Ответ приходит в следующем виде: {"list":[{"id":"1","ima":"...","count(marker.district)":"1" }, .........., "allLIST":[{"count(*)":"6"}]} В аяксе хочу выводить только значения ima и count(marker.district), но выводится все это добро сразу три раза... При этом, при выводе ключа "allLIST":[{"count(*)":"6"}]} - все происходит нормально в этом куске кода: for (var key1 in list['allLIST']) { html+='<a class = "link" onclick="event.preventDefault()">'; for (var key2 in list['allLIST'][key1]) { html+='<li class = "big" onclick="alldistrict()")>Все районы  \(' + list['allLIST'][key1]['count(*)'] + "\)</li>"; } html+='</a>'; } console.log(html); $("ul.list").html(html); Собственно, вопрос в том, как пофиксить дублирование строк при выводе их из ассоциативного массива в цикле:) Пардон, скорее из объекта, а не массива |
Зачем этот цикл?
Цитата:
|
Начнем учить тебя как делать тестовый пример...
Цитата:
Цитата:
Т.е. привести 3-4 полновесных элемента (а у тебя один) для демонстрации Ну и потом показать пример хтмля, который хочешь получить на этих данных. Все! Тестовый пример готов. С ним можно будет работать. ;) |
Цитата:
Примеры 3-х элементов в list+allLIST: {"list":[{"id":"1","ima":"\u0421\u0432\u044f\u0442\u043e\u0 448\u0438\u043d\u0441\u043a\u0438\u0439","count(ma rker.district)":"1"}, {"id":"2","ima":"\u0413\u043e\u043b\u043e\u0441\u0 435\u0435\u0432\u0441\u043a\u0438\u0439","count(ma rker.district)":"1"}, {"id":"3","ima":"\u0414\u0430\u0440\u043d\u0438\u0 446\u043a\u0438\u0439","count(marker.district)":"0 "}, .......... "allLIST":[{"count(*)":"6"}]} Желаемый html-код: <li class = "big" onclick="findList(1)">Святошинский (0)</li> Тобишь: '<li class = "big" onclick="findList(' +КЛЮЧ id + ')">' + КЛЮЧ ima + " \(" + КЛЮЧ count(marker.district) + '\)</li>' |
Цитата:
А мне пришлось твою писанину еще и подправлять. Вот такой вариант получился. <!DOCTYPE html> <html> <head> <meta http-equiv='Content-Type' content='text/html; charset=windows-1251' /> <script src='http://code.jquery.com/jquery-latest.js'></script> <!-- <script src="https://code.angularjs.org/1.3.9/angular.min.js"></script> <script src="https://code.angularjs.org/1.3.9/angular-route.js"></script> --> <style type='text/css'> </style> <script type='text/javascript'> var obj={ "list":[ { "id":"1", "ima":"\u0421\u0432\u044f\u0442\u043e\u0448\u0438\u043d\u0441\u043a\u0438\u0439", "count(marker.district)":"1" }, { "id":"2", "ima":"\u0413\u043e\u043b\u043e\u0441\u0435\u0435\u0432\u0441\u043a\u0438\u0439", "count(marker.district)":"1" }, { "id":"3", "ima":"\u0414\u0430\u0440\u043d\u0438\u0446\u043a\u0438\u0439", "count(marker.district)":"0 " } ], "allLIST":[ {"count(*)":"6"} ] }; $(function(){ var o=$('#test') for (var i=0; i<obj.list.length; i++) { var str='<li class = "big" onclick="alert(' + (i + 1) + ')">'; str=str + obj.list[i].ima + ' (' + obj.list[i]['count(marker.district)']; str=str + ')</li>'; o.append(str); }; }); </script> </head> <body> <ul id='test'></ul> </body> </html> Вот это и называется тестовым примером. :write: |
Цитата:
Сейчас протестирую на своем примере и отпишусь:) Спасибо большое, что помогаете на этом форуме и мне, и остальным таким же... недалеким:) |
Цитата:
А, поняла. Добавление в #test |
var list = function (){ $.ajax({ type: "POST", url: "../php/list.php", success: function (data) { var obj = JSON.parse(data); var str = ""; for (var i=0; i<obj.list.length; i++) { var str='<li class = "big" onclick="findList(' + obj.list[i]['id'] + ')">'; str=str + obj.list[i].ima + ' (' + obj.list[i]['count(marker.district)']; str=str + ')</li>'; } $("ul.list").html(str); } }) } list(); } При вот таком измененном коде выводит теперь только последнюю запись из объекта... |
Нашла ошибку вот в этом кусочке кода...
Цитата:
Просто нереально огромное Вам спасибо! Возможно, обращусь еще, но надеюсь, что потребности в этом не возникнет:) |
Цитата:
Ты просто записываешь переменную str один раз Цитата:
|
Цитата:
|
Цитата:
Некоторые просто не умеют воспринимать критику адекватно. А ведь если просишь помощи - проси смиренно:) |
Цитата:
Дело в том, что нужно научиться помогать себе самостоятельно. ;) |
Часовой пояс GMT +3, время: 22:13. |