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

Форум PHP

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

 

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

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

тема: Рекурсивная функция.
 
 автор: saniamu   (06.06.2010 в 00:30)   письмо автору
 
 

Есть таблица: id, login, step, pid. Дерево выстраивается по id и pid, выдает login. Но должно остановится когда step=2, ближайший по ветке. Не знаю как сделать, помогите. Извините за белеберду!

  Ответить  
 
 автор: sl1p   (06.06.2010 в 01:28)   письмо автору
 
   для: saniamu   (06.06.2010 в 00:30)
 

<?
function go($pid 0) {
    
$res mysql_query("SELECT * FROM table WHERE pid = {$pid}");
    if(
$res && mysql_num_rows($res)) {
        while(
$r mysql_fetch_assoc($res)) {
            
            
print_r($r);
            
            if(
$r['step'] == 2)
                return;
            
            
$pid $r['pid'];
            
call_user_func(__FUNCTION__$pid);
        }
    }
}

  Ответить  
 
 автор: Tonik992   (06.06.2010 в 04:03)   письмо автору
 
   для: sl1p   (06.06.2010 в 01:28)
 

вместо return; используй break; как вариант

  Ответить  
 
 автор: Trianon   (06.06.2010 в 11:25)   письмо автору
 
   для: sl1p   (06.06.2010 в 01:28)
 

неплохо бы проверять написанное.
Особенно с таким пафосом, как call_user_func(__FUNCTION__, ...) - подход, достойный перфекциониста.

  Ответить  
 
 автор: sl1p   (06.06.2010 в 12:57)   письмо автору
 
   для: Trianon   (06.06.2010 в 11:25)
 

я никогда так не юзал но думал будет удобней при изменении имени, а что здесь не так?:)

  Ответить  
 
 автор: Trianon   (06.06.2010 в 13:06)   письмо автору
 
   для: sl1p   (06.06.2010 в 12:57)
 

самое основное - в строке, где Вы переменной $pid значение присваиваете.

  Ответить  
 
 автор: sl1p   (06.06.2010 в 13:09)   письмо автору
 
   для: Trianon   (06.06.2010 в 13:06)
 

честно, слепой)
объясните)

  Ответить  
 
 автор: Trianon   (06.06.2010 в 13:15)   письмо автору
 
   для: sl1p   (06.06.2010 в 13:09)
 

что Вы ей присваиваете?

Ps. Почему Вы сами не хотите проверить работу функции?

  Ответить  
 
 автор: sl1p   (06.06.2010 в 13:47)   письмо автору
 
   для: Trianon   (06.06.2010 в 13:15)
 

<? 
function go($pid 0) { 
    
$res mysql_query("SELECT * FROM table WHERE pid = {$pid}"); 
    if(
$res && mysql_num_rows($res)) { 
        while(
$r mysql_fetch_assoc($res)) { 
             
            
print_r($r); 
             
            if(
$r['step'] == 2
                return; 
             
            
call_user_func(__FUNCTION__$r['id']); 
        } 
    } 
}

точно))
Ps. Почему Вы сами не хотите проверить работу функции?
нет сил таблицу создать)

Ps. так а в чём проблема со строкой call_user_func(__FUNCTION__, $r['id']); ?

  Ответить  
 
 автор: Trianon   (06.06.2010 в 13:58)   письмо автору
 
   для: sl1p   (06.06.2010 в 13:47)
 

>Ps. Почему Вы сами не хотите проверить работу функции?
>нет сил таблицу создать)

А меня пытать силы нашлись.

>Ps. так а в чём проблема со строкой call_user_func(__FUNCTION__, $r['id']); ?
нет там проблемы.
просто на фоне той ошибки она выглядит слишком претенциозно.

  Ответить  
 
 автор: saniamu   (06.06.2010 в 16:17)   письмо автору
 
   для: sl1p   (06.06.2010 в 01:28)
 

Большое спасибо, сам бы я не додумался. Вот только хотелось бы чтобы выдавал один результат (login), да еще забыл условие правильно задать: step=2 или step=3 или step=4 и так далее до 8-ми, одно из этих условий, но обязательно ближайшее по ветке. Заранее благодарен.

  Ответить  
 
 автор: sl1p   (06.06.2010 в 17:25)   письмо автору
 
   для: saniamu   (06.06.2010 в 16:17)
 

<?  
function go($pid 0) {  
    
$res mysql_query("SELECT * FROM table WHERE pid = {$pid}");  
    if(
$res && mysql_num_rows($res)) {  
        while(
$r mysql_fetch_assoc($res)) {  
            
            echo 
$r['login'];
            
            if(
$r['step'] >= 2)  
                return;  
            
            
call_user_func(__FUNCTION__$r['id']);  
        }  
    }  
}

  Ответить  
 
 автор: saniamu   (06.06.2010 в 18:15)   письмо автору
 
   для: sl1p   (06.06.2010 в 17:25)
 

Выдаёт несколько результатов, нужен один.

  Ответить  
 
 автор: sl1p   (06.06.2010 в 19:23)   письмо автору
 
   для: saniamu   (06.06.2010 в 18:15)
 

я если честно не могу понять что значит "ближайшее по ветке"

но возможно так:

<?  
function go($pid 0) {  
    
$res mysql_query("SELECT * FROM table WHERE pid = {$pid}");  
    if(
$res && mysql_num_rows($res)) {  
        while(
$r mysql_fetch_assoc($res)) {  
            if(
$r['step'] >= 2)  
                return;
            
            echo 
$r['login'];
            
            
call_user_func(__FUNCTION__$r['id']);  
        }  
    }  
}

  Ответить  
 
 автор: Trianon   (06.06.2010 в 21:12)   письмо автору
 
   для: sl1p   (06.06.2010 в 19:23)
 

Вы пытаетесь думать за человека.
Что, в таком случае, Вы оставите ему?

  Ответить  
 
 автор: sl1p   (06.06.2010 в 21:24)   письмо автору
 
   для: Trianon   (06.06.2010 в 21:12)
 

возможно человек совсем не разбирается и правильній пример ему поможет разобраться :)

  Ответить  
 
 автор: Trianon   (06.06.2010 в 21:33)   письмо автору
 
   для: sl1p   (06.06.2010 в 21:24)
 

Допустим... правильный ...хм.. пример Вы ему уже дали.
И что? Он остановился разобраться хоть на минуту?
Они лишь ждет, пока Вы всё отальное за него добъете.

  Ответить  
 
 автор: saniamu   (07.06.2010 в 09:36)   письмо автору
 
   для: sl1p   (06.06.2010 в 19:23)
 

Прошу прощения! Всё работает, это я сам допустил небольшую ошибку. Спасибо за помощь.

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

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