|
|
|
| Пожалуйста подскажите!
Есть такой код: В одной таблице базы данных содержатся наименования отделов и подотделов подчиненность выбирается по id_parent. Необходимо по параметру id_otdel передаваемому в функцию представить в виде одномерного массива подотделы, которые подчинены отделу id_otdel которого передается в функцию.
<?php
$user=User(1);
echo $user;
function User($id_otdel)
{
$sSQL = "SELECT * FROM otdel WHERE id_parent=".$id_otdel;
$result=mysql_query($sSQL);
if(mysql_num_rows($result)>0)
{
while($row=mysql_fetch_array($result))
{
$id1=$row['id_otdel'];
$name_otdel=$row['name_otdel'];
User($id1);
return $name_otdel;
}
}
}
|
По идее функция должна возращать $name_otdel в виде массива, а она возвращает название одного отдела. Где может быть ошибка? | |
|
|
|
|
|
|
|
для: fsn
(20.10.2008 в 15:38)
| | $name_otdel=array();
$name_otdel[]=$row['name_otdel']; | |
|
|
|
|
|
|
|
для: sl1p
(20.10.2008 в 15:48)
| | А в какой части кода задается $name_otdel=array(); | |
|
|
|
|
|
|
|
для: fsn
(20.10.2008 в 15:38)
| | когда вызывается функция return функция закрывается", надо так:
<?php
$user=User(1);
echo $user;
function User($id_otdel)
{
$name_otdel=array();
$sSQL = "SELECT * FROM otdel WHERE id_parent=".$id_otdel;
$result=mysql_query($sSQL);
if(mysql_num_rows($result)>0)
{
while($row=mysql_fetch_array($result))
{
$id1=$row['id_otdel'];
$name_otdel[]=$row['name_otdel'];
User($id1);
}
}
return $name_otdel;
}
?>
|
| |
|
|
|
|
|
|
|
для: DEM
(20.10.2008 в 15:49)
| | Пробовал тоже самое получается | |
|
|
|
|
|
|
|
для: DEM
(20.10.2008 в 15:49)
| | User($id1); --потеря возвращенного результата.
(устало) Здесь не требуется рекурсия. | |
|
|
|
|
|
|
|
для: Trianon
(20.10.2008 в 16:03)
| | Почему потеря? Если я внутри функции и внутри цикла вывожу echo таким образом
<?php
User(1);
function User($id_otdel)
{
$sSQL = "SELECT * FROM otdel WHERE id_parent=".$id_otdel;
$result=mysql_query($sSQL);
if(mysql_num_rows($result)>0)
{
$name_otdel=array();
while($row=mysql_fetch_array($result))
{
$id1=$row['id_otdel'];
$name_otdel=$row['name_otdel'];
User($id1);
echo $name_otdel."<br>";
}
}
}
?>
|
То выводятся все отделы, но мне надо поместить их в массив и массив вывести из функции. | |
|
|
|
|
|
|
|
для: fsn
(20.10.2008 в 16:10)
| | Тогда зачем вообще этот вызов? | |
|
|
|
|
|
|
|
для: Trianon
(20.10.2008 в 16:19)
| | Мне надо параметр в коде проверить на наличие его в выводимом из функции массива. | |
|
|
|
|
|
|
|
для: fsn
(20.10.2008 в 16:25)
| | Я теперь понял. Наверное выводить значение return-ом из рекурсивной функции нельзя, так как оно выведется один раз, а при рекурсивном вызове не выведется. А что теперь делать? Мне надо зная id_otdel отдела вывести в массиве подчиненные отделы этого отдела. Подскажите пожалуйста! | |
|
|
|
|
|
|
|
для: fsn
(20.10.2008 в 18:56)
| | Вам не нужна рекурсия!
<?php
function User($id_otdel)
{
$name_otdel=array();
$sSQL = "SELECT * FROM otdel WHERE id_parent=".$id_otdel;
$result=mysql_query($sSQL);
while($row=mysql_fetch_array($result))
$name_otdel[]=$row['name_otdel'];
return $name_otdel;
}
$x = User(1);
print_r($x);
?>
|
Нужно лишь при вызове не терять возвращенное значение. | |
|
|
|
|
|
|
|
для: Trianon
(20.10.2008 в 19:12)
| | Почему не нужна, а если подчиненность больше второго уровня, то есть у найденных допустим двух, есть еще подчиненные? | |
|
|
|
|
|
|
|
для: fsn
(20.10.2008 в 19:26)
| | все равно не нужна.
Даже если нужно получить всю ветвь, не повод издавать на каждый узел отдельный запрос.
можно получить список очередного уровня скопом. | |
|
|
|
|
|
|
|
для: Trianon
(20.10.2008 в 19:43)
| | А как это сделать? | |
|
|
|
|
|
|
|
для: fsn
(20.10.2008 в 19:50)
| | WHERE id_parent IN (список) | |
|
|
|
|
|
|
|
для: Trianon
(20.10.2008 в 19:52)
| | Подскажите пожалуйста, хотя бы структуру кода, цикл while надо применять внутри другого цикла? | |
|
|
|
|
|
|
|
для: fsn
(21.10.2008 в 11:19)
| | конечно.
Внешний цикл перебирает уровни узлов.
Внутренний собирает результат SQL-запроса | |
|
|
|
|
|
|
|
для: Trianon
(21.10.2008 в 11:24)
| | Примерно так? Или где-то ошибка?
Я просто сейчас проверить не могу, только вечером.
<?php
function User($id_otdel)
{
$name_otdel=array();
$sSQL = "SELECT * FROM otdel WHERE id_parent=".$id_otdel;
$result=mysql_query($sSQL);
while($row=mysql_fetch_array($result))
{
$sgl = "SELECT * FROM otdel WHERE id_parent=".$row['id_otdel'];
//Или второй вариант $sgl = "SELECT * FROM otdel WHERE id_otdel=".$row['id_parent']
$result_sql=mysql_query($sql);
while($row1=mysql_fetch_array($result_sql)
{
$name_otdel[]=$row1['name_otdel'];
}
}
return $name_otdel;
}
$x = User(1);
print_r($x);
?>
|
| |
|
|
|
|
|
|
|
для: fsn
(21.10.2008 в 11:41)
| | нет. Не так. | |
|
|
|
|
|
|
|
для: fsn
(21.10.2008 в 11:41)
| | Чуть поправил.
<?php
function User($id_otdel)
{
$name_otdel=array();
$id_otdel2=array();
$sSQL = "SELECT * FROM otdel WHERE id_parent=".$id_otdel;
$result=mysql_query($sSQL);
while($row=mysql_fetch_array($result))
{
$id_otdel2[]=$row['id_otdel'];
$sgl = "SELECT * FROM otdel WHERE IN $id_otdel2";
$result_sql=mysql_query($sql);
while($row1=mysql_fetch_array($result_sql)
{
$name_otdel[]=$row1['name_otdel'];
}
}
return $name_otdel;
}
$x = User(1);
print_r($x);
?>
|
| |
|
|
|
|
|
|
|
для: fsn
(21.10.2008 в 11:59)
| | Нет.
Схематически должно получиться прмерно так:
список1 = array()
список2 = array(id)
выполнять
список2 = результат SQL-запроса потомков узлов из списка2;
добавить список2 к списку1
пока список2 не пуст
вернуть список1
|
Учитывая, что на выходе Вам нужны имена, а не ключи, будет чуть иначе, хотя и не сильно. | |
|
|
|
|
|
|
|
для: Trianon
(21.10.2008 в 12:07)
| | Как правильно построить запрос с WHERE IN?
$sql= "SELECT * FROM otdel WHERE id_parent = $id_otdel[] IN $id_otdel"
$id_otdel - список.
Если неправильно напишите пожалуйста. | |
|
|
|
|
|
|
|
для: fsn
(21.10.2008 в 12:24)
| | если $id_otdel действительно список, к примеру, $id_otdel = "(1,5,15)"; то именно так и построить.
UPD. Вы меняете пост с вопросом после отправки. Тогда не так.
В запросе должна оказаться строка вида WHERE id_parent IN (1,5,15) | |
|
|
|
|
|
|
|
для: Trianon
(21.10.2008 в 12:27)
| | Понял | |
|
|
|
|
|
|
|
для: Trianon
(21.10.2008 в 12:27)
| | Имеет смысл для этого применить php-функцию implode() | |
|
|
|
|
|
|
|
для: Trianon
(21.10.2008 в 12:31)
| | Мне наименования узлов по большому счету не нужны. Мне надо проверить параметр $id_otdel, котороый передается в функцию на наличие его в полученном массиве, который будет состоять из id_otdel. Наименования я применял в примере, чтобы не запутаться в числах. | |
|
|
|
|
|
|
|
для: fsn
(21.10.2008 в 12:41)
| | Вернее не так $id_otdel, который передается в функцию-это родитель. А в коде надо проверить id_otdel, чтобы он являлся потомком. | |
|
|
|
|
|
|
|
для: fsn
(21.10.2008 в 12:47)
| | Ну никак не могу построить код по такой структуре
список1 = array()
список2 = array(id)
выполнять
список2 = результат SQL-запроса потомков узлов из списка2;
добавить список2 к списку1
пока список2 не пуст
вернуть список1
|
Может чуть подробнее подскажете?
И не понятно
список2 = результат SQL-запроса потомков узлов из списка2;
Тут нет опечатки?
Цикл с постусловием? | |
|
|
|
|
|
|
|
для: fsn
(22.10.2008 в 01:04)
| | Написал код, где $id1 -первый список, $id2-второй
function User($id_otdel)
{
$id2=array();
$sSQL = "SELECT * FROM otdel WHERE id_parent=".$id_otdel;
$result=mysql_query($sSQL);
while($row=mysql_fetch_array($result))
{
$id2[]=$row['id_otdel'];
}
$id1=array();
do {
$sSQL1="SELECT * FROM otdel WHERE id_parent IN(" . implode(',', $id2) . ")";
$result1 = mysql_query($sSQL1);
while($row1=mysql_fetch_array($result1))
{
$id1[]=$row1['id_otdel'];
}
} while($id1 != NULL)
$id=array_merge($id2,$id1);
return $id;
}
|
Пишет ошибку
Parse error: parse error, unexpected T_VARIABLE, expecting ';' in ..........line23 | |
|
|
|
|
|
|
|
для: fsn
(22.10.2008 в 01:11)
| |
<?
function User($id)
{
list1 = array();
list2 = array($id);
do
{
$sql = "SELECT id_otdel FROM otdel WHERE id_parent IN (".implode(',',$list2).")";
for($list2 = array(), $res = mysql_query($sql); $row = mysql_fetch_row($res); $list2[] = $row[0])
$list1[] = $row[0];
} while(! empty($list2));
return $list1;
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(22.10.2008 в 01:37)
| | Огромное спасибо | |
|
|
|