Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Дублирование при выводе в дерево [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 [2] 3 »   

> Без описания
Bartezz
Отправлено: 28 Августа, 2012 - 11:29:46
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




Просто топчемся на одном месте, вы выбираете список услуг из таблицы `service_cl` с их id и описанием (как я понял), далее проходите циклом (while) по этому списку, но на выводе (между <li> и </li>) id услуги и описание услуги у вас выходит всегда одно и тоже, а лишь меняется параметр checked, почему так происходит? Потому что всегда идет одно и тоже значение из $a_tree[$id_par_service][$i]['id_service'] и $a_tree[$id_par_service][$i]['name_service'] , поэтому, просто необходимо с помощью $usl_checki передавать индекс в массив $a_tree[$id_par_service][$i] чтоб на выходе список услуг (строк) не дублировался
(Добавление)
Тогда может так? Изменить
PHP:
скопировать код в буфер обмена
  1. $a_tree[$id_par_service][$i]['id_service']

на
PHP:
скопировать код в буфер обмена
  1. $a_tree[$id_par_service][$usl_checki['id_service']]['id_service']



А
PHP:
скопировать код в буфер обмена
  1. $a_tree[$id_par_service][$i]['name_service']

на
PHP:
скопировать код в буфер обмена
  1. $a_tree[$id_par_service][$usl_checki['id_service']]['name_service']

Но все это походит на гадание на кофейной гуще
(Добавление)
Насчет массива $a_tree неясна его структура
 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 11:35:02
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет:
Просто топчемся на одном месте, вы выбираете список услуг из таблицы `service_cl` с их id и описанием (как я понял), далее проходите циклом (while) по этому списку, но на выводе (между <li> и </li>) id услуги и описание услуги у вас выходит всегда одно и тоже, а лишь меняется параметр checked, почему так происходит? Потому что всегда идет одно и тоже значение из $a_tree[$id_par_service][$i]['id_service'] и $a_tree[$id_par_service][$i]['name_service'] , поэтому, просто необходимо с помощью $usl_checki передавать индекс в массив $a_tree[$id_par_service][$i] чтоб на выходе список услуг (строк) не дублировался

Из таблицы service_cl я выбираю id_service, где id_con=определенное значение, потом захожу в таблицу dir_service и вывожу оттуда все услуги, но, необходимо чтобы те, которые есть в service_cl с id_con, были при выводе отмечены галочками.
 
 Top
Bartezz
Отправлено: 28 Августа, 2012 - 11:36:45
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




непонятно какая вообще взаимосвязь между $a_tree[$id_par_service][$i]['name_service'] и массивом $usl_checki
(Добавление)
Все что вы пишите я понял, непонятно как описание услуг в массиве $a_tree можно сопоставить с выборкой $usl_checki
 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 11:39:24
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет:
непонятно какая вообще взаимосвязь между $a_tree[$id_par_service][$i]['name_service'] и массивом $usl_checki

$a_tree[$id_par_service][$i]['name_service'] - это вывод названия услуги.
А $usl_checki - это услуги в контракте, если услуга в контракте = услуге в дереве, то checked="checked"
 
 Top
Bartezz
Отправлено: 28 Августа, 2012 - 11:43:00
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




удалил...

(Отредактировано автором: 28 Августа, 2012 - 11:45:57)

 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 11:46:31
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет:
Раз вы выбираете список услуг в массив $style, почему бы в нем не пытаться найти подходящую?
То есть вместо
PHP:
скопировать код в буфер обмена
  1. $a_tree[$id_par_service][$i]['id_service']

должно быть
PHP:
скопировать код в буфер обмена
  1. $style[$usl_checki['id_service']]

$usl_checki['name_service'] - такого быть не может, в service_cl нет поля name_service
 
 Top
Bartezz
Отправлено: 28 Августа, 2012 - 11:51:06
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




Скажите мне как вывести названия услуги $a_tree[$id_par_service][$i]['name_service'] зная ее $usl_checki?
 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 11:52:53
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет:
Скажите мне как вывести названия услуги $a_tree[$id_par_service][$i]['name_service'] зная ее [b][/b]?

Никак. $usl_checki - это просто выбор услуг, которые есть в договоре, а первый массив - это все услуги. Вот, привожу полный кусок кода...
PHP:
скопировать код в буфер обмена
  1. <div id="derevo">
  2.          <form id="form2" name="form2" method="post" action="edit_cont1.php">
  3.     <input type="hidden" name="act" value="{action}" />
  4.       <table width="100%" border="0">
  5.        
  6.         <tr>
  7.          
  8.           <td><label for="id_par_service"></label>
  9. <script type="text/javascript">
  10. $(document).ready(function(){
  11.         jQuery('#add li ul ').hide();
  12.         jQuery('#add li').css('cursor','pointer');
  13.         $("#serv_edit").click(function(){
  14.                 window.location = 'edit_service.php?id='+ $("input:radio:checked").val();
  15.         });
  16.        
  17.  
  18.  
  19. })
  20.  
  21. jQuery(function()
  22. {  
  23. jQuery('#add').slideToggle(400);
  24. }
  25. );
  26.  
  27. function tgg_parent(el){
  28.         //.css({'list-style-image': 'url(/images/papka.png)'})
  29.         //$(el).parent().children("ul").slideToggle(400);
  30.          $(el).parent().children("ul").slideToggle(400);
  31.          $(el).parent().toggleClass('plus minus')
  32.  
  33. }
  34.  
  35.  
  36. </script>
  37. <div id="add" style="display:none;">
  38.  
  39. <?PHP
  40.   $a_tree=array();
  41.   //Ключ массива - идентификатор родительского элемента
  42.   // значение - список дочерних элементов
  43.  
  44.   //Загружаем сразу все дерево одним запросом
  45.   $r=mysql_query("
  46.    select
  47.     id_service,   #идентификатор элемента
  48.     id_par_service, #идентификатор родительского элемента
  49.                    #   элементы верхнего уровня содержат здесь 0
  50.     name_service,
  51.     parent #название
  52.    from
  53.         dir_service
  54.     where ud_ser='0'",$link);
  55.           if(!$r) echo mysql_error();
  56.   //  списки дочерних элементов этого массива были отсортированы по этому полю.
  57.   for($i=0;$i<mysql_num_rows($r);$i++)
  58.   {
  59.     $f=mysql_fetch_assoc($r);
  60.     if(empty($a_tree[$f['id_par_service']]))
  61.       $a_tree[$f['id_par_service']]=array();
  62.     $a_tree[$f['id_par_service']][]=$f;
  63.    
  64.   }
  65.  
  66.   //Выводим данные.
  67.  //$usl_check = mysql_query("SELECT * FROM `service_cl` WHERE `id_con` = '".$can['id_con']."' and `ud_s_cl`='0' and `dateser_can`='0000-00-00'");
  68.         //while ($usl_check=mysql_fetch_array($usl_check)){
  69.   function tree_print(&$a_tree,$id_par_service=0)
  70.   {
  71.     //условие завершения рекурсии
  72.     //Условие, при котором функция никогда не вызывает сама себя
  73.  
  74.     //функция empty() - вернет ложь во всех нужных нам случаях:
  75.     // - элемент массива не определен
  76.     // - элемент массива определен, но является пустым массивом
  77.     if(empty($a_tree[$id_par_service])) {
  78.         return;}
  79.  
  80.  
  81.          
  82.        
  83.     echo "<ul>";
  84.  
  85.  
  86.     foreach ($a_tree[$id_par_service] as $value)
  87.     {    // $style=mysql_query("select * from `dir_service` where `id_service`='".$value['id_service']."'");
  88.          // $style=mysql_fetch_assoc($style);
  89.        
  90.            $usl_check = mysql_query("SELECT * FROM `service_cl` WHERE `id_con` = '".(int)$_GET['id']."' and `ud_s_cl`='0' and `dateser_can`='0000-00-00'");
  91.         while ($usl_checki=mysql_fetch_array($usl_check)){
  92.        
  93.            if ($value['id_service']==$usl_checki['id_service']) {$s='checked'; } else $s='';}
  94.       if ($value['parent']==1){
  95.       echo "<li class='plus'><INPUT TYPE=checkbox  NAME=parent onClick='apply()' VALUE=".$value['id_service']." ".$s."><span onclick='tgg_parent(this);'>".$value['name_service']."</span>";
  96.       }
  97.       if ($value['parent']==0){
  98.       echo "<li class='non'><INPUT TYPE=checkbox  NAME=parent onClick='apply()' VALUE=".$value['id_service']." ".$s."><span onclick='tgg_parent(this);'>".$value['name_service']."</span>";
  99.       }
  100.        
  101.       //рекурсивный вызов - список всех дочерних элементов нужно вставить
  102.       //  именно в этом месте:
  103.       //  <li>название
  104.       //     ** тут список дочерних элементов, он показывается рекурсивным вызовом **
  105.       //  </li>
  106.       tree_print($a_tree,$value['id_service']);
  107.       echo "</li>";
  108.   }
  109.     echo "</ul>";
  110.                
  111.   }
  112.    
  113.   //Показываем все дерево:
  114.   tree_print($a_tree);
  115.  
  116. ?>
  117.  
  118. </div>
  119.           </td>
  120.         </tr>
  121.       </table>
  122.    
  123.     </form></div>
 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 11:55:32
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет:
Скажите мне как вывести названия услуги $a_tree[$id_par_service][$i]['name_service'] зная ее $usl_checki?

Нужно, чтоб выглядело вот так:
Прикреплено изображение (Нажмите для увеличения)
1.JPG
 
 Top
Bartezz
Отправлено: 28 Августа, 2012 - 11:56:15
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




то есть $usl_checki не содержит id услуги по которой ее можно идентифицировать в списке услуг?
 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 11:57:57
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет:
то есть $usl_checki не содержит id услуги по которой ее можно идентифицировать в списке услуг?

Содержит, как раз и проверяется, если id одинаковые, то ставится checked
 
 Top
Bartezz
Отправлено: 28 Августа, 2012 - 11:58:06
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




про это место я не говорил что надо изменять
 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 11:58:47
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет: про это место я не говорил что надо изменять

В этом месте идет проверка, папка это или нет
(Добавление)
Я просто убрала $style и пометила все в
PHP:
скопировать код в буфер обмена
  1.    select
  2.     id_service,   #идентификатор элемента
  3.     id_par_service, #идентификатор родительского элемента
  4.                    #   элементы верхнего уровня содержат здесь 0
  5.     name_service,
  6.     parent #название
  7.    from
  8.         dir_service
  9.     where ud_ser='0'",$link);

Т.е. в общий массив

(Отредактировано автором: 28 Августа, 2012 - 12:01:12)

 
 Top
Bartezz
Отправлено: 28 Августа, 2012 - 12:24:02
Post Id



Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2010  


Помог: 1 раз(а)




мне в голову приходит только LEFT JOIN по id_con таблицы service_cl с той таблицей которая содержит наименование и id услуги сопоставимое с id услуги указанном в service_cl, или (чтоб было покривее) делать внутри цикла while запрос к таблице содержащей наименование услуги, которое можно определить по id полученном в выборке $usl_check

(Отредактировано автором: 28 Августа, 2012 - 12:27:23)

 
 Top
quinlena
Отправлено: 28 Августа, 2012 - 12:25:02
Post Id


Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Апр. 2012  
Откуда: Казахстан


Помог: 0 раз(а)




Bartezz пишет:
мне в голову приходит только LEFT JOIN по id_con таблицы service_cl с той таблицей которая содержит наименование и id услуги сопоставимое с id услуги указанном в service_cl

А как потом checked проставлять?
(Добавление)
Дерево должно быть все выведено...
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB