Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: обход дерева ассоциативных массивов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
roadster
Отправлено: 07 Июля, 2013 - 11:14:30
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Июль 2013  
Откуда: Ukraine


Помог: 0 раз(а)




Помогите написать функцию для прохода дерева ассоциативных массивов. Дерево имеет примерно следующую структуру:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $array1 = array(
  2.     '190' => array(
  3.         'loginId' => 'login1',
  4.         'FIO' => 'Petrov',
  5.         'email' => 'mail@mail.mm'
  6.         'childNode' => array(
  7.             '200' => array (
  8.                 'loginId' => 'login2',
  9.                 'FIO' => 'Ivanov',
  10.                 'email' => 'a@a.aa'
  11.                 'childNode' => array(),
  12.                 ),
  13.             ),
  14.          ),
  15.      '305' => array (
  16.         'loginId' => 'login3',
  17.         'FIO' => 'FIO',
  18.         'email' => 'mail@a.aa',
  19.         'childNode' => array(),
  20.        ),
  21. );


Уже голову сломал, не выходит ничего.


Отредактировано модератором: Саныч, 07 Июля, 2013 - 11:41:05
 
 Top
OrmaJever Модератор
Отправлено: 07 Июля, 2013 - 11:19:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




смотря что с ним нужно сделать, но я думаю рекурсия подойдёт.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
roadster
Отправлено: 07 Июля, 2013 - 11:39:30
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Июль 2013  
Откуда: Ukraine


Помог: 0 раз(а)




Нужно написать функцию, которая проходила бы до определенного элемента в дереве, что бы можно было модифицировать данные пользователей которых она проходит по пути к выбранному, или даже просто посчитать сколько "точек" нужно пройти что бы добраться до указанного 'loginId'. Да про рекурсию я уже понял конечно, но все равно не выходит, ну не хватает мне опыта к сожалению (

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

CODE (htmlphp):
скопировать код в буфер обмена
  1. function gotoLogin($sourceArray, $loginId)
  2. {
  3. $res = array(); // суда запишем какие id проходит цикл
  4. foreach ($sourceArray as $key => $value)
  5. {
  6.     echo $key['loginId'];
  7.     while ( $key['childNode'] != array() )
  8.     {
  9.         ...
  10.         $res[] = $key['loginId'];
  11.     }
  12. }
  13. }


и еще попутно вопрос, нельзя ли без рекурсии, я не говорю что нужно без нее, скорее всего так было бы проще, хотя сам еще не додумался как правильно составить цикл, но все же..
(Добавление)
Никто не может помочь? Хм


Отредактировано модератором: Саныч, 07 Июля, 2013 - 11:40:42
 
 Top
MADONZY
Отправлено: 07 Июля, 2013 - 12:53:44
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




roadster, тот код что ты кинул - абсурд...
1 - не закрыл кавычку:

2 - откуда ты взял $src??
3 - тут только рекурсия тебе поможет... вот так:
PHP:
скопировать код в буфер обмена
  1.  
  2. while ( $key['childNode'] != array() )
  3.     {
  4.         ...
  5.         $res[] = $key['loginId];
  6.        gotoLogin($sourceArray, $loginId);
  7.   }
  8.  
 
 Top
roadster
Отправлено: 07 Июля, 2013 - 13:01:21
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Июль 2013  
Откуда: Ukraine


Помог: 0 раз(а)




MADONZY пишет:
roadster, тот код что ты кинул - абсурд...
1 - не закрыл кавычку:

2 - откуда ты взял $src??
3 - тут только рекурсия тебе поможет... вот так:
PHP:
скопировать код в буфер обмена
  1.  
  2. while ( $key['childNode'] != array() )
  3.     {
  4.         ...
  5.         $res[] = $key['loginId];
  6.        gotoLogin($sourceArray, $loginId);
  7.   }
  8.  


Спасибо, за кавычку сорри, это я писал как пример. Буду пробовать.
(Добавление)
Столкнулся с такой проблемой, что бы сохранить результат, мне нужно объявить массив в начале функции $result = array(); и получается при рекурсии, функция снова запускается и переменная не сохраняет предыдущий результат, имхо $result = array(); очищает переменную, как быть?
 
 Top
Denkill
Отправлено: 07 Июля, 2013 - 13:14:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 330
Дата рег-ции: Янв. 2013  
Откуда: Барнаул


Помог: 7 раз(а)




roadster $result = array(); пиши не в рекурсию а выше

PHP:
скопировать код в буфер обмена
  1.  
  2. $result = array();
  3.  
  4. function fun(){
  5.    fun();
  6. }
  7.  


-----
Хо-Хо-Хо
 
 Top
MADONZY
Отправлено: 07 Июля, 2013 - 13:15:36
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Тогда используй статическую переменную
 
 Top
DelphinPRO
Отправлено: 07 Июля, 2013 - 13:33:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)





MADONZY пишет:
3 - тут только рекурсия тебе поможет...

Запомните: любой код написанный с использованием рекурсии можно написать без использования оной.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
EuGen Администратор
Отправлено: 07 Июля, 2013 - 13:42:37
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DelphinPRO
Я бы сказал больше - любой код может быть преобразован к виду, в котором последовательно используется только цикл и ветвление (то есть, к примеру, if + while)
теорема Бёма-Якопини


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
roadster
Отправлено: 07 Июля, 2013 - 13:46:40
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Июль 2013  
Откуда: Ukraine


Помог: 0 раз(а)




Подскажите пожалуйста, где у меня ошибка, вот что получилось:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $result = array();
  2. $temp = array();
  3.  
  4. function rrroad($src)
  5. {    
  6.     foreach ($src as $key => $value)
  7.     {
  8.         while ($value['childNode'] != array())
  9.         {
  10.             $result[] = $value['loginId'];
  11.             unset($temp);
  12.             $temp = $value['childNode'];
  13.             rrroad($temp);
  14.         }
  15.     }
  16. print_r($result);  
  17. }


Почему пишет Undefined variable: result in ..... ???? Не пойму что делаю не так
 
 Top
VenZell
Отправлено: 07 Июля, 2013 - 13:50:24
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




Ты объявляешь переменную ВНЕ функции.
PHP:
скопировать код в буфер обмена
  1. function rrroad($src)
  2. {    
  3.     $result = array();
  4.     $temp = array();
  5.     foreach ($src as $key => $value)
  6.     {
  7.         while ($value['childNode'] != array())
  8.         {
  9.             $result[] = $value['loginId'];
  10.             unset($temp);
  11.             $temp = $value['childNode'];
  12.             rrroad($temp);
  13.         }
  14.     }
  15. print_r($result);  
  16. }

(Отредактировано автором: 07 Июля, 2013 - 13:51:06)

 
 Top
roadster
Отправлено: 07 Июля, 2013 - 13:54:38
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Июль 2013  
Откуда: Ukraine


Помог: 0 раз(а)




Как же тогда быть? Если их объявить в функции то они будут обнуляться посредством $result = array(); $temp = array(); как я уже писал выше. Использовать глобальные переменные?
 
 Top
vanicon
Отправлено: 07 Июля, 2013 - 13:58:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)






-----
Так было, так есть и так будет
 
 Top
EuGen Администратор
Отправлено: 07 Июля, 2013 - 14:02:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. $rgData=array(
  2.         'A'=>'numA',
  3.         'B'=>array(
  4.                 'D'=>'numD',
  5.                 'E'=>'numE'
  6.         ),
  7.         'C'=>'numC',
  8.         'F'=>array(
  9.                 'G'=>'numG',
  10.                 'H'=>'numH',
  11.                 'I'=>array(
  12.                         'J'=>'numJ',
  13.                         'K'=>array(
  14.                                 'L'=>'numL',
  15.                                 'M'=>'numM'
  16.                         ),
  17.                         'N'=>'numN'
  18.                 )
  19.         )
  20. );
  21.  
  22. $rRecursiveIterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($rgData));
  23. foreach($rRecursiveIterator as $sKey=>$sValue)
  24. {
  25.         echo('Key is '.$sKey.'; value is '.$sValue.'; depth is '.$rRecursiveIterator->getDepth().PHP_EOL);
  26. }

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
roadster
Отправлено: 07 Июля, 2013 - 14:06:33
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Июль 2013  
Откуда: Ukraine


Помог: 0 раз(а)




[quote=vanicon]roadster
http://www.php.su/learnphp/vars/?statvars [/quote]
Да да, извиняюсь, переписал со статикой, теперь функция просто зациклилась...
(Добавление)
[quote=EuGen][/quote]

Спасибо большое, теперь хоть есть над чем покурить!
(Добавление)
Вот что получилось, собственно теперь вопрос в другом, как мне получить все элементы, которые проходит цикл до указанного ($loginId), если корень не один, а два, три и т.д.
У меня получается так, что элементы считает от первого и пока не найдет нужный, а как сделать что б считало от корня, в котором нужный элемент ($loginId) находится?

CODE (htmlphp):
скопировать код в буфер обмена
  1. function getRoad($src,$loginId)
  2. {
  3.     static $result;
  4.     $recIterator = new RecursiveIteratorIterator( new RecursiveArrayIterator($src));
  5.    
  6.     foreach($recIterator as $key => $value)
  7.     {
  8.         if (!is_array($value))
  9.         {
  10.             if ($recIterator->key() == 'loginId')
  11.             {
  12.                 //$result[] = $value;
  13.                 $result[] = $value;
  14.                 //print_r($result);
  15.                 echo "\n";
  16.                 if ($value == $loginId)
  17.                 {
  18.                     return $result;
  19.                 }
  20.             }
  21.         }
  22.     }
  23.     //print_r($result);
  24. }


$newAr = getRoad($source_array,1234);
print_r($newAr);


Отредактировано администратором: EuGen, 07 Июля, 2013 - 17:43:53
Обращаю Ваше внимание, что поднятие тем не разрешается. Подробнее: http://forum.php.su/topic.php?forum=25&topic=808
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB