Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Передача параметра из функции
 
 автор: fsn   (20.10.2008 в 15:38)   письмо автору
 
 

Пожалуйста подскажите!
Есть такой код: В одной таблице базы данных содержатся наименования отделов и подотделов подчиненность выбирается по 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 в виде массива, а она возвращает название одного отдела. Где может быть ошибка?

  Ответить  
 
 автор: sl1p   (20.10.2008 в 15:48)   письмо автору
 
   для: fsn   (20.10.2008 в 15:38)
 

$name_otdel=array();
$name_otdel[]=$row['name_otdel'];

  Ответить  
 
 автор: fsn   (20.10.2008 в 15:58)   письмо автору
 
   для: sl1p   (20.10.2008 в 15:48)
 

А в какой части кода задается $name_otdel=array();

  Ответить  
 
 автор: DEM   (20.10.2008 в 15:49)   письмо автору
 
   для: 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
}

?>

  Ответить  
 
 автор: fsn   (20.10.2008 в 15:57)   письмо автору
 
   для: DEM   (20.10.2008 в 15:49)
 

Пробовал тоже самое получается

  Ответить  
 
 автор: Trianon   (20.10.2008 в 16:03)   письмо автору
 
   для: DEM   (20.10.2008 в 15:49)
 

User($id1); --потеря возвращенного результата.

(устало) Здесь не требуется рекурсия.

  Ответить  
 
 автор: fsn   (20.10.2008 в 16:10)   письмо автору
 
   для: 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>";
        }
    }
      }
?>

То выводятся все отделы, но мне надо поместить их в массив и массив вывести из функции.

  Ответить  
 
 автор: Trianon   (20.10.2008 в 16:19)   письмо автору
 
   для: fsn   (20.10.2008 в 16:10)
 

Тогда зачем вообще этот вызов?

  Ответить  
 
 автор: fsn   (20.10.2008 в 16:25)   письмо автору
 
   для: Trianon   (20.10.2008 в 16:19)
 

Мне надо параметр в коде проверить на наличие его в выводимом из функции массива.

  Ответить  
 
 автор: fsn   (20.10.2008 в 18:56)   письмо автору
 
   для: fsn   (20.10.2008 в 16:25)
 

Я теперь понял. Наверное выводить значение return-ом из рекурсивной функции нельзя, так как оно выведется один раз, а при рекурсивном вызове не выведется. А что теперь делать? Мне надо зная id_otdel отдела вывести в массиве подчиненные отделы этого отдела. Подскажите пожалуйста!

  Ответить  
 
 автор: Trianon   (20.10.2008 в 19:12)   письмо автору
 
   для: 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);

?>

Нужно лишь при вызове не терять возвращенное значение.

  Ответить  
 
 автор: fsn   (20.10.2008 в 19:26)   письмо автору
 
   для: Trianon   (20.10.2008 в 19:12)
 

Почему не нужна, а если подчиненность больше второго уровня, то есть у найденных допустим двух, есть еще подчиненные?

  Ответить  
 
 автор: Trianon   (20.10.2008 в 19:43)   письмо автору
 
   для: fsn   (20.10.2008 в 19:26)
 

все равно не нужна.

Даже если нужно получить всю ветвь, не повод издавать на каждый узел отдельный запрос.
можно получить список очередного уровня скопом.

  Ответить  
 
 автор: fsn   (20.10.2008 в 19:50)   письмо автору
 
   для: Trianon   (20.10.2008 в 19:43)
 

А как это сделать?

  Ответить  
 
 автор: Trianon   (20.10.2008 в 19:52)   письмо автору
 
   для: fsn   (20.10.2008 в 19:50)
 

WHERE id_parent IN (список)

  Ответить  
 
 автор: fsn   (21.10.2008 в 11:19)   письмо автору
 
   для: Trianon   (20.10.2008 в 19:52)
 

Подскажите пожалуйста, хотя бы структуру кода, цикл while надо применять внутри другого цикла?

  Ответить  
 
 автор: Trianon   (21.10.2008 в 11:24)   письмо автору
 
   для: fsn   (21.10.2008 в 11:19)
 

конечно.
Внешний цикл перебирает уровни узлов.
Внутренний собирает результат SQL-запроса

  Ответить  
 
 автор: fsn   (21.10.2008 в 11:41)   письмо автору
 
   для: 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); 
?> 

  Ответить  
 
 автор: Trianon   (21.10.2008 в 11:58)   письмо автору
 
   для: fsn   (21.10.2008 в 11:41)
 

нет. Не так.

  Ответить  
 
 автор: fsn   (21.10.2008 в 11:59)   письмо автору
 
   для: 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);  
?>  

  Ответить  
 
 автор: Trianon   (21.10.2008 в 12:07)   письмо автору
 
   для: fsn   (21.10.2008 в 11:59)
 

Нет.
Схематически должно получиться прмерно так:

   список1 = array()
   список2 = array(id)

   выполнять
        список2 = результат SQL-запроса потомков узлов из списка2;
        добавить список2 к списку1
   пока список2 не пуст

   вернуть список1


Учитывая, что на выходе Вам нужны имена, а не ключи, будет чуть иначе, хотя и не сильно.

  Ответить  
 
 автор: fsn   (21.10.2008 в 12:24)   письмо автору
 
   для: Trianon   (21.10.2008 в 12:07)
 

Как правильно построить запрос с WHERE IN?
$sql= "SELECT * FROM otdel WHERE id_parent = $id_otdel[] IN $id_otdel"
$id_otdel - список.
Если неправильно напишите пожалуйста.

  Ответить  
 
 автор: Trianon   (21.10.2008 в 12:27)   письмо автору
 
   для: fsn   (21.10.2008 в 12:24)
 

если $id_otdel действительно список, к примеру, $id_otdel = "(1,5,15)"; то именно так и построить.
UPD. Вы меняете пост с вопросом после отправки. Тогда не так.

В запросе должна оказаться строка вида WHERE id_parent IN (1,5,15)

  Ответить  
 
 автор: fsn   (21.10.2008 в 12:30)   письмо автору
 
   для: Trianon   (21.10.2008 в 12:27)
 

Понял

  Ответить  
 
 автор: Trianon   (21.10.2008 в 12:31)   письмо автору
 
   для: Trianon   (21.10.2008 в 12:27)
 

Имеет смысл для этого применить php-функцию implode()

  Ответить  
 
 автор: fsn   (21.10.2008 в 12:41)   письмо автору
 
   для: Trianon   (21.10.2008 в 12:31)
 

Мне наименования узлов по большому счету не нужны. Мне надо проверить параметр $id_otdel, котороый передается в функцию на наличие его в полученном массиве, который будет состоять из id_otdel. Наименования я применял в примере, чтобы не запутаться в числах.

  Ответить  
 
 автор: fsn   (21.10.2008 в 12:47)   письмо автору
 
   для: fsn   (21.10.2008 в 12:41)
 

Вернее не так $id_otdel, который передается в функцию-это родитель. А в коде надо проверить id_otdel, чтобы он являлся потомком.

  Ответить  
 
 автор: fsn   (22.10.2008 в 01:04)   письмо автору
 
   для: 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:11)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Trianon   (22.10.2008 в 01:37)   письмо автору
 
   для: 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;
}

  Ответить  
 
 автор: fsn   (22.10.2008 в 01:56)   письмо автору
 
   для: Trianon   (22.10.2008 в 01:37)
 

Огромное спасибо

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования