Вложенные массивы

Ann

Новичок
Вложенные массивы

PHP:
$query="select id from class where flag_menu=1";
$result=mysql_query($query, $dblink) or die("Query failed");
while ($pro = mysql_fetch_array ($result)) 
{ 
   $id[] = $pro["id"];
}

for ( $i = 0; $i < count($id) ; $i++ )
{
$main="<div id=menu$id[$i]>";
echo $main;
echo "<table bgcolor=#FCB231>";

	$qu="select id, name from class where id_parent=$id[$i]";
	$res=mysql_query($qu, $dblink) or die("Query failed1");
print_r ($res);
	while ($pr = mysql_fetch_array ($res)) 
	{ 
   	$id_class[] = $pr["id"];
   	$name[] = $pr["name"];
	}
	for ( $n = 0; $n < count($id_class) ; $n++ )
	{
	echo "<tr>";
	$tr="<td id=$id_class[$n]";
	$tr .= " bgcolor=#FCB231 onMouseOver=chbg($id_class[$n],1);";
	$tr .= " onMouseOut=chbg($id_class[$n],0);";
	$tr .= " style=cursor: hand;><a href=?WFi=$id_class[$n] class=navLink10px id=menuHead$id_class[$n]>$name[$n]&nbsp;&raquo;</a></td>";
	echo $tr;
	echo "</tr>";

	}
echo "</table>";
}
Выводит все данные, но в каждой таблице начинает с первого члена массива (то есть новые данные подписывает к старым в каждой таблице). Как исправить положение?
 

Ann

Новичок
Спасибо, я торможу. А отладчик есть, я его просто не указала в данном куске.
 

SelenIT

IT-лунатик :)
Зачем вообще тут вложенные запросы в цикле?
PHP:
<?
$lastcat = -1; // заведомо невозможный id категории
$query="select t1.id, t1.name, t1.id_parent from class t1, class t2 where t2.flag_menu=1 and t2.id=t1.id_parent order by t1.id_parent, t1.id";
$res=mysql_query($qu, $dblink) or die("Query failed");
while ($pr = mysql_fetch_assoc($res))
{
   // если id категории поменялся - закроем предыдущий раздел меню,
   // (если есть чего закрывать) и откроем новый 
   if ($pr['id_parent'] != $lastcat) {
      if ($lastcat > 0) {
         ?></table></div><?             
      }
      ?>
<div id="menu<? echo $pr['id_parent']; ?>">
<table bgcolor="#FCB231"><?
       $lastcat = $pr['id_parent'];
   }
   ?>
   <tr>
       <td id="<? echo $pr['id']; ?>" bgcolor="#FCB231" onMouseOver="chbg(<? echo $pr['id']; ?>,1);" onMouseOut="chbg(<? echo $pr['id']; ?>,0);" style="cursor: hand;">
            <a href="?WFi=<? echo $pr['id']; ?>" class="navLink10px" id="menuHead<? echo $pr['id']; ?>"><? echo $pr['name']; ?>&nbsp;&raquo;</a>
       </td>
   </tr>
<?
}
// закроем последний раздел меню, если надо
if ($lastcat > 0) {
   ?>
</table>
</div><?             
}
?>
 

Ann

Новичок
Спасибо за совет. Попробую и Вашим методом. Просто мне так как сделано понятнее.
 

SelenIT

IT-лунатик :)
Ой, я в том варианте пропустил принципиальный момент (уже исправил), приношу извинения.
Кстати, выводить не обязательно сразу, можно и сначала собирать данные в многомерный массив. Например, наподобие такого:
PHP:
<?
// получение данных
$menu = array();
$query="select t1.id, t1.name, t1.id_parent from class t1, class t2 where t2.flag_menu=1 and t2.id=t1.id_parent order by t1.id_parent, t1.id";
$res=mysql_query($query, $dblink) or die("Query failed");
while ($pr = mysql_fetch_assoc($res))
{
   $menu[$pr['id_parent']][] = array('id'=>$pr['id'], 'name'=>$pr['name']);
}

// вывод результата выборки
foreach ($menu as $cat => $items)
{
   ?>
<div id="menu<? echo $cat; ?>">
<table bgcolor="#FCB231">
<?
   foreach ($items as $i => $item)
   {
      ?>
   <tr>
       <td id="<? echo $item['id']; ?>" bgcolor="#FCB231" onMouseOver="chbg(<? echo $item['id']; ?>,1);" onMouseOut="chbg(<? echo $item['id']; ?>,0);" style="cursor: hand;">
            <a href="?WFi=<? echo $item['id']; ?>" class="navLink10px" id="menuHead<? echo $item['id']; ?>"><? echo $item['name']; ?>&nbsp;&raquo;</a>
       </td>
   </tr>
<?
   }
?>
</table>
</div>
<?
}
?>
Главное, что я хотел показать - что желательно избавляться от мелких запросов в цикле, если можно выбрать все, что нужно, в 1-2 запроса.
 
Сверху