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

Форум PHP

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

 

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

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

тема: Статичный или глобальный массив использовать в функции?
 
 автор: 1999   (24.02.2007 в 16:59)   письмо автору
 
 


<?
function rubrics_parent$parent_id 0,$level )
{
    global 
$db_options;
    static 
$output = array();

    
$sql "SELECT * FROM ".$db_options['table_prefix']."rubrics WHERE parent_id = '".$parent_id."'";
    
$query mysql_query$sql ) or dc_error);
    if ( 
mysql_num_rows$query ) == ) return;

    
$nu_index count$output );
    while ( 
$row mysql_fetch_assoc$query ) )
    {
        
$output[$nu_index]['value'] = $row['id'];
        
$output[$nu_index]['text'] = $row['name_rus'];

        
$nu_level $level 1;
        
$output rubrics_parent$row['id'],$nu_level );
    }

    return 
$output;
}
?>


собственно что хочу - прохожу по всем рубрикам (parent_id - это id родительской рубрики) рекурсией и хочу на выходе иметь некий массив вида


Array
(
    [0] => Array
        (
            [value] => 1
            [text] => Главная
        )

    [1] => Array
        (
            [value] => 2
            [text] => 123
        )

)


Ан нет - на выходе вобще пусто. Никогда не мог разобраться в этих статик и глобалс, вот похоже время и пришло(( помогите пожалуста!

   
 
 автор: 1999   (24.02.2007 в 21:01)   письмо автору
 
   для: 1999   (24.02.2007 в 16:59)
 

.

   
 
 автор: cheops   (25.02.2007 в 01:05)   письмо автору
 
   для: 1999   (24.02.2007 в 16:59)
 

Объявите $output глобальным и не возвращайте его значение при помощи return.

   
 
 автор: 1999   (25.02.2007 в 01:36)   письмо автору
 
   для: cheops   (25.02.2007 в 01:05)
 

хм... т.е. статичным его делать не надо впринципе?
а как тогда я смогу получить выходной массив $output? Ведь данные, передаваемые в ф-цию с типом global изменяются только в теле самой ф-ции... и возвращать таки что-то надо..

   
 
 автор: cheops   (25.02.2007 в 12:23)   письмо автору
 
   для: 1999   (25.02.2007 в 01:36)
 

Глобальный массив и его содержимое будет доступен и после окончания работы функции.

   
 
 автор: 1999   (25.02.2007 в 15:55)   письмо автору
 
   для: cheops   (25.02.2007 в 12:23)
 

...а значение его не изменится - я только что проверил

   
 
 автор: cheops   (26.02.2007 в 00:45)   письмо автору
 
   для: 1999   (25.02.2007 в 15:55)
 

В смысле? Не очень понятно...

   
 
 автор: 1999   (26.02.2007 в 01:15)   письмо автору
 
   для: cheops   (26.02.2007 в 00:45)
 

ну есть массив, он существует в основном теле программы
я его в функции объявляю глобальным и изменяю его значение. но после выполнения функции массив этот будет как и был до нее, поскольку изменения идут над копией.. ну как я понимаю

   
 
 автор: Whi-teOoS   (26.02.2007 в 01:39)   письмо автору
 
   для: 1999   (26.02.2007 в 01:15)
 

& все дело в нем... наверно)

   
 
 автор: kasmanaft   (26.02.2007 в 06:23)   письмо автору
 
   для: 1999   (26.02.2007 в 01:15)
 

Нет, Вы будете работать именно с этим массивом

   
 
 автор: ZuArt   (26.02.2007 в 10:07)   письмо автору
 
   для: kasmanaft   (26.02.2007 в 06:23)
 

Попробуйте вот этот код...


<?
$out 
= array();
rubrics_parent(0, &$out);

function 
rubrics_parent($parent_id 0, &$out)
{
  global 
$db_options;

  
$sql "SELECT * FROM ".$db_options['table_prefix']."rubrics WHERE parent_id = '".$parent_id."'";
  
$query mysql_query$sql ) or dc_error);
  if ( 
mysql_num_rows$query ) == ) return;

  
$i 0;
  while ( 
$row mysql_fetch_assoc$query ) )
  {
   
$out[$i]["Id"] = $row["Id"];
   
$out[$i]["Text"] = $row["Text"];
   
// тут просто читаются все свойства из строки, которые надо считать
   
$i++;
 }

 foreach(
$out as $key => $val)
 {
  
$out[$key]["Ch"] = array();
  
rubrics_parent($val["Id"], &$out[$key]["Ch"])
 };
}
?> 


По окончании выполнения получите массив следующей структуры

каждый элемент являенся "хранилищем каждой строки" с доп. "полем" - $arr["Ch"] - в которое заносятся все дочерние элементы такой-же структуры.

А не работать исходная функция может по одной простой причине - рекурсивный вызов функции mysql_query выполняется раньше, чем обрабатывается предыдущий запрос - может из-за этого глюки

   
 
 автор: ZuArt   (26.02.2007 в 10:35)   письмо автору
 
   для: ZuArt   (26.02.2007 в 10:07)
 

Попробую отрисовать вид массива

<?
// корень
$out = array(
                       [
0] = array( // 1 эл. корня
                                          
Id Id;
                                          
Text Text;
                                          
Ch = array( // массив дочерних элементов
                                                              
[0] = array(
                                                                                 
Id Id;
                                                                                 
Text Text;
                                                                                 
Ch = array();
                                                                                 );
                                                              [
1] = array(
                                                                                 
Id Id;
                                                                                 
Text Text;
                                                                                 
Ch = array();
                                                                                 );
                                                             );
                                         )
                       [
1] = array( // 2 элемент корня
                                          
Id Id;
                                          
Text Text;
                                          
Ch = array( // дочерние элементы
                                                              
[0] = array(
                                                                                 
Id Id;
                                                                                 
Text Text;
                                                                                 
Ch = array();
                                                                                 );
                                                             );
                                         )
                      )
?>

   
 
 автор: yuri   (26.02.2007 в 14:53)   письмо автору
 
   для: 1999   (24.02.2007 в 16:59)
 

return не возвращает переменную, а возвращает значение.

<?
$output
=rubrics_parent();
?>

   
 
 автор: ZuArt   (26.02.2007 в 15:53)   письмо автору
 
   для: yuri   (26.02.2007 в 14:53)
 

и??? я непонимаю, в чем сложность написать вместо

$output=rubrics_parent();



$output = array();
rubrics_parent(&$output);

   
Rambler's Top100
вверх

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