Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2012, 08:53
Интересующийся
Отправить личное сообщение для vladimirlip Посмотреть профиль Найти все сообщения от vladimirlip
 
Регистрация: 18.12.2012
Сообщений: 15

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

Последний раз редактировалось vladimirlip, 18.12.2012 в 09:05.
Ответить с цитированием
  #2 (permalink)  
Старый 18.12.2012, 09:17
жажду знаний
Отправить личное сообщение для bushstas Посмотреть профиль Найти все сообщения от bushstas
 
Регистрация: 17.07.2009
Сообщений: 202

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

Последний раз редактировалось bushstas, 18.12.2012 в 09:23.
Ответить с цитированием
  #3 (permalink)  
Старый 18.12.2012, 09:33
Интересующийся
Отправить личное сообщение для vladimirlip Посмотреть профиль Найти все сообщения от vladimirlip
 
Регистрация: 18.12.2012
Сообщений: 15

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

Последний раз редактировалось vladimirlip, 18.12.2012 в 10:11.
Ответить с цитированием
  #4 (permalink)  
Старый 18.12.2012, 09:58
Интересующийся
Отправить личное сообщение для vladimirlip Посмотреть профиль Найти все сообщения от vladimirlip
 
Регистрация: 18.12.2012
Сообщений: 15

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

Последний раз редактировалось vladimirlip, 18.12.2012 в 10:26.
Ответить с цитированием
  #5 (permalink)  
Старый 18.12.2012, 10:55
жажду знаний
Отправить личное сообщение для bushstas Посмотреть профиль Найти все сообщения от bushstas
 
Регистрация: 17.07.2009
Сообщений: 202

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)
		}
// что-то вроде того проверь там
Ответить с цитированием
  #6 (permalink)  
Старый 18.12.2012, 11:01
Интересующийся
Отправить личное сообщение для vladimirlip Посмотреть профиль Найти все сообщения от vladimirlip
 
Регистрация: 18.12.2012
Сообщений: 15

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

Последний раз редактировалось vladimirlip, 18.12.2012 в 11:05.
Ответить с цитированием
  #7 (permalink)  
Старый 21.10.2016, 14:28
Интересующийся
Отправить личное сообщение для Navka1 Посмотреть профиль Найти все сообщения от Navka1
 
Регистрация: 21.10.2016
Сообщений: 12

Здравствуйте! Понимаю, что теме уже >4 лет, но столкнулась с абсолютно идентичной проблемой, так что даже зарегистрировалась на форуме и вышла из режима readonly

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. Помогите пожалуйста, кто сможет. Уже три дня бьюсь головой о клаву...
Заранее спасибо!
Ответить с цитированием
  #8 (permalink)  
Старый 21.10.2016, 14:56
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,137

Сообщение от Navka1
Помогите пожалуйста, кто сможет.
Какова суть задачи? Что "дано"? Что нужно "получить" в итоге?
Ответить с цитированием
  #9 (permalink)  
Старый 21.10.2016, 14:58
Интересующийся
Отправить личное сообщение для Navka1 Посмотреть профиль Найти все сообщения от Navka1
 
Регистрация: 21.10.2016
Сообщений: 12

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

Запросы к базе и тд. не предоставила, потому как объект (массив) практически идентичен с объектом автора темы.
Ответить с цитированием
  #10 (permalink)  
Старый 21.10.2016, 15:10
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,137

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен цикл для создания огромного массива apish Общие вопросы Javascript 2 20.09.2012 16:10
JS Перебор ассоциативного многомерного массива zbs2000 Events/DOM/Window 8 23.07.2012 01:23
Перебор массива объектов Триви jQuery 12 26.08.2011 09:22
Формирование двухмерного массива в javascript Neokortex Элементы интерфейса 9 24.03.2011 17:51
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53