Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Перебор двухмерного массива (https://javascript.ru/forum/misc/34017-perebor-dvukhmernogo-massiva.html)

vladimirlip 18.12.2012 08:53

Перебор двухмерного массива
 
Здравствуйте!
Есть задача: при помощи 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="Татьяна "
, ещё...}

bushstas 18.12.2012 09:17

у тебя явно косяк внутри двух циклов где формируется 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)
		}
// отпишись как помозгуешь

vladimirlip 18.12.2012 09:33

Спасибо тебе огромное! щас выводит правильно. Только три строки. Но, в разных ячейках

vladimirlip 18.12.2012 09:58

Есть ещё вопрос:
Щас он выводит каждый элемент в отдельную ячейку, т.е получается 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-ре столбца и т.д.

bushstas 18.12.2012 10:55

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)
		}
// что-то вроде того проверь там

vladimirlip 18.12.2012 11:01

Изящно, Зачёт! Сработало. Вывел три строки в каждой по 4-ре ячейки

Navka1 21.10.2016 14:28

Здравствуйте! Понимаю, что теме уже >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"] + "&nbsp\(" + 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(*)']+")>Все районы"  + "&nbsp\(" + list.allLIST['count(*)'] + "\)</li></a>";
				console.log(html);
				$("ul.list").html(html);
			}

Прочитав ответ от bushstas, выполнила его совет. В итоге все равно выводит по три строки в один <li>. А list.allLIST['count(*)'] вообще выдает undefined. Помогите пожалуйста, кто сможет. Уже три дня бьюсь головой о клаву...
Заранее спасибо!

ksa 21.10.2016 14:56

Цитата:

Сообщение от Navka1
Помогите пожалуйста, кто сможет.

Какова суть задачи? Что "дано"? Что нужно "получить" в итоге?

Navka1 21.10.2016 14:58

Цитата:

Сообщение от ksa (Сообщение 432480)
Какова суть задачи? Что "дано"? Что нужно "получить" в итоге?

Все "входные данные" абсолютно совпадают с проблемой, описанной в начале топика. При проходе по циклу в <а> добавляется сразу три <li>, как и у автора темы. Изменила код на тот, который любезно предоставил bushstas, проблема осталась... Чувствую, что дело именно в цикле.

Запросы к базе и тд. не предоставила, потому как объект (массив) практически идентичен с объектом автора темы.

ksa 21.10.2016 15:10

Navka1, начнем с того, что в тег <a> не стоит "вставлять" теги <li>...

Для анализа циклов бывает достаточно просто выводить то, с чем имеешь дело в самом цикле. Обычно это многое проясняет... ;)


Часовой пояс GMT +3, время: 05:40.