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 :: обход дерева ассоциативных массивов [2]

 PHP.SU

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


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

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



Новичок


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


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




подскажите, объявляю я массив $a = array(); он по идее пустой, но не могу проверить его на пустоту, пишу например:

$a = array();

if (! empty($a))
{
'Ne pustoi';
}
if (empty($a))
{
echo 'Pustoi';
}

Получается что он не пустой, пробовал считать элементы путем count, не помогает, isset тоже не срабатывает, т.к. массив объявлен, пробовал перебирать через foreach и проверять ключ, но так же безрезультатно. Как правильно проверить массив? В чем ошибка?

(Отредактировано автором: 07 Июля, 2013 - 22:14:57)

 
 Top
avtor.fox
Отправлено: 07 Июля, 2013 - 22:20:56
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




 
 Top
VenZell
Отправлено: 07 Июля, 2013 - 22:22:45
Post Id


Частый гость


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


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




Только что проверил. Выводится сообщение 'Pustoi', как и положено. Однако вот тут:

Вы забыли echo.

И все же я код переписал бы вот так:
PHP:
скопировать код в буфер обмена
  1. $a = array();
  2. echo (empty($a)) ? 'Pustoi' : 'Ne pustoi';

Или хотя бы вот так:
PHP:
скопировать код в буфер обмена
  1. $a = array();
  2. if (empty($a)){
  3.    echo 'Pustoi';
  4. } else {
  5.    echo 'Ne pustoi';
  6. }

Ну и во время отладки смотрите, что у вас в массиве:

(Отредактировано автором: 07 Июля, 2013 - 22:25:44)

 
 Top
DelphinPRO
Отправлено: 07 Июля, 2013 - 22:29:53
Post Id



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


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


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




VenZell пишет:
И все же я код переписал бы вот так:

[ ZANUDA ON ]
а я бы так: echo (empty($a)) ? 'Empty' : 'Not empty';
или так: echo (empty($a)) ? 'Пустой' : 'Не пустой';
[ ZANUDA OFF ]


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
roadster
Отправлено: 07 Июля, 2013 - 22:36:39
Post Id



Новичок


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


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




Спасибо, разобрался, видимо нужно отдохнуть а то мозги уже не варят. Никак с этим деревом не разберусь...
 
 Top
avtor.fox
Отправлено: 07 Июля, 2013 - 22:44:37
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




[ LICEMER ON \]

PHP:
скопировать код в буфер обмена
  1. $e = array(3);
  2. echo (explode('/', join('/', $e))[0] != '') ? 'Не пустой' : 'Пустой';


[LICEMER OFF /]

но, если в массиве будет ключ с пустым значением, он скажет, что массив пуст.
 
 Top
EuGen Администратор
Отправлено: 07 Июля, 2013 - 23:08:50
Post Id


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


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


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




avtor.fox
Не очень понял, в чём смысл такой проверки.
Ну и если

- сами понимаете, что некорректно отработает.


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



Новичок


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


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




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

CODE (htmlphp):
скопировать код в буфер обмена
  1.     $array1 = array(
  2.         '190' => array(
  3.             'loginId' => '190',
  4.             'login' => 'login1',
  5.             'email' => 'mail@mail.mm'
  6.             'childNode' => array(
  7.                 '200' => array (
  8.                     'loginId' => '200',
  9.                     'login' => 'login2',
  10.                     'email' => 'a@a.aa'
  11.                     'childNode' => array(),
  12.                     ),
  13.                 ),
  14.              ),
  15.          '305' => array (
  16.             'loginId' => '305',
  17.             'login' => 'login3',
  18.             'email' => 'mail@a.aa',
  19.             'childNode' => array(),
  20.            ),
  21.     );
  22.  
  23. function goArray($array, $ID)
  24. {
  25. static $result;
  26. static $temp1;
  27.    
  28. foreach ($array as $key => $value)
  29. {
  30.     $result[] = $value['loginId'];
  31.    
  32.     //тут не проходит сравнение
  33.     if ($value['loginId'] == $ID)
  34.     {
  35.         return $result;
  36.     }
  37.    
  38.     unset($temp1);
  39.     $temp1 = $value['childNode'];
  40.    
  41.     echo $value['loginId'] . "\n";
  42.    
  43.     goArray($temp1, $ID);
  44. }  
  45. }
  46.  
  47. goArray($array1, '200');


Не пойму почему не срабатывает сравнение...

(Отредактировано автором: 08 Июля, 2013 - 08:57:36)

 
 Top
VenZell
Отправлено: 08 Июля, 2013 - 00:17:05
Post Id


Частый гость


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


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




roadster, для начала, у вас неверно объявлен массив.
PHP:
скопировать код в буфер обмена
  1. $array1 = array(
  2.     '190' => array(
  3.         'loginId' => '190',
  4.         'login' => 'login1',
  5.         'email' => 'mail@mail.mm', //здесь у вас не хватало запятой
  6.         'childNode' => array(
  7.             '200' => array(
  8.                 'loginId' => '200',
  9.                 'login' => 'login2',
  10.                 'email' => 'a@a.aa', //и здесь тоже
  11.                 'childNode' => array(),
  12.             ),
  13.         ),
  14.     ),
  15.     '305' => array(
  16.         'loginId' => '305',
  17.         'login' => 'login3',
  18.         'email' => 'mail@a.aa',
  19.         'childNode' => array(),
  20.     ),
  21. );

Далее, $source_array в указанном вами куске кода не объявлен, но это, как я понял, $array1
Далее, в указанном вами куске кода вы обращаетесь к ключу $value['userID'], а в массиве, над котором вы работаете такого ключа нет. Есть 'loginId'.
Далее, в указанном вами куске кода вы обращаетесь к ключу $value['childNodes'], а в массиве, над котором вы работаете такого ключа нет. Есть 'childNode'.

Если внести эти правки в скрипт, он выведет два значения: 190 и 305.
Будьте внимательнее и поставьте себе какую-нибудь IDE, тот же NetBeans.
Не сочтите за рекламу, тем более, что он бесплатен, но так вам будет проще видеть ошибки в своем коде.
p.s. и зачем вам переменная $key, если вы все равно ее не используете?

(Отредактировано автором: 08 Июля, 2013 - 00:19:53)

 
 Top
avtor.fox
Отправлено: 08 Июля, 2013 - 01:48:47
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




EuGen, тс утверждает, что ни один из нормальных способов проверки массива на пустоту не работает. И это как самопальный, но не совсем удачный пример незамысловатой проверки.

Автор, опишите задачу полностью, ибо ответ дать на сие описание проблемы — глупо. Сами себя запутали же. Откуда данные, почему именно так нужно изменить некоторые ключи, зачем записывать айдишники и прочее.
 
 Top
roadster
Отправлено: 08 Июля, 2013 - 08:50:48
Post Id



Новичок


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


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




Спасибо за помощь, разобрался. Писал ночью, по этому видимо мозг уже не работал, сегодня трезвым взглядом все прояснил. Поставил NetBeans, довольно удобно, особенно если учесть что и бесплатно. А задача такая, нужно что бы функция проходила по деревey до указанного в параметре $ID.

(Отредактировано автором: 08 Июля, 2013 - 09:00:17)

 
 Top
EuGen Администратор
Отправлено: 08 Июля, 2013 - 09:41:20
Post Id


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


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


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




roadster пишет:
А задача такая, нужно что бы функция проходила по деревey до указанного в параметре $ID.

Это совсем не та же самая задача, что и "обход дерева". Предлагаю такой вариант:
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. function getAncestors(&$rgData, $sSearchValue)
  23. {
  24.    foreach($rgData as $sKey=>$mValue)
  25.    {
  26.       if(is_array($mValue) && count($rgAncestors = getAncestors($mValue, $sSearchValue)))
  27.       {
  28.          return array_merge([$sKey], $rgAncestors);
  29.       }
  30.       elseif($mValue==$sSearchValue)
  31.       {
  32.          return [$sKey];
  33.       }
  34.    }
  35.    return array();
  36. }
  37.  
  38. //var_dump(getAncestors($rgData, 'numL'));


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



Новичок


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


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




Ругается на конструкцию [$sKey]. Пробовал и $sKey и $sKey[], все равно ругается или ошибка синтаксиса ну это и так ясно, или что переменная - не массив. Вроде должно работать. Попробую проверить каждую переменную.
 
 Top
DelphinPRO
Отправлено: 08 Июля, 2013 - 10:32:44
Post Id



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


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


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




roadster пишет:
Ругается на конструкцию [$sKey]. Пробовал и $sKey и $sKey[]


это массив в php5.4

в нижних версиях: array($sKey)


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
roadster
Отправлено: 08 Июля, 2013 - 10:47:08
Post Id



Новичок


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


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




Спасибо, у меня 5.3 стоит. Надо читать изменения а то я впервые встречаю данную конструкцию. Всем большое спасибо кто откликнулся, буду тут почаще сидеть, может и я кому помогу )
 
 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