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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
kosik82
Отправлено: 25 Июля, 2013 - 21:11:36
Post Id


Гость


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


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




есть массив, например
PHP:
скопировать код в буфер обмена
  1. $input[1][0]='a';
  2. $input[1][1]='b';
  3. $input[1][2]='c';
  4. $input[1][3]='d';
  5. $input[2][0]='b';
  6. $input[2][1]='d';
  7. $input[2][2]='f';
  8. $input[3][0]='e';
  9. $input[3][1]='a';


нужно убрать повторяющиеся значения и вывести в строку.

не получается
 
 Top
EuGen Администратор
Отправлено: 25 Июля, 2013 - 21:36:26
Post Id


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


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


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




Самое простое:
PHP:
скопировать код в буфер обмена
  1. $rgLinear = array();
  2. foreach($rgInput as $iOne=>$rgValue)
  3. {
  4.    foreach($rgValue as $iTwo=>$sValue)
  5.    {
  6.       if(in_array($sValue, $rgLinear))
  7.       {
  8.          unset($rgInput[$iOne][$iTwo]);
  9.       }
  10.       else
  11.       {
  12.          $rgLinear[]=$sKey;
  13.       }
  14.    }
  15. }
  16. //var_dump($rgInput);


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


Гость


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


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




EuGen пишет:
Самое простое:
PHP:
скопировать код в буфер обмена
  1. $rgLinear = array();
  2. foreach($rgInput as $iOne=>$rgValue)
  3. {
  4.    foreach($rgValue as $iTwo=>$sValue)
  5.    {
  6.       if(in_array($sValue, $rgLinear))
  7.       {
  8.          unset($rgInput[$iOne][$iTwo]);
  9.       }
  10.       else
  11.       {
  12.          $rgLinear[]=$sKey;
  13.       }
  14.    }
  15. }
  16. //var_dump($rgInput);


у меня есть во такой способ
PHP:
скопировать код в буфер обмена
  1. foreach ($oblako as $key => $value){
  2.    foreach ($value as $ke => $va){ if ($va !== '')$ob[] = $va; }
  3. }
  4. $ob =  array_unique($ob);  echo  implode(", ", $ob);


но хотелось бы не запускать цикл в цикле

судя по описанию , array_unique http://www.php.su/functions/?array-unique работает с многомерными массивами. а на деле это не так?
 
 Top
EuGen Администратор
Отправлено: 25 Июля, 2013 - 22:22:27
Post Id


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


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


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




Разумеется, работает. Однако она рассматривает только первый уровень, таким образом сравнивая массивы, которые будут находиться на втором уровне.
Можно без двойного цикла. Пример для произвольного уровня вложенности:
PHP:
скопировать код в буфер обмена
  1. function array_unique_recursive(&$rgData, $bUnsetEmpty=false, &$rgStack=[])
  2. {
  3.         foreach($rgData as $mKey=>&$mValue)
  4.         {
  5.                 if(is_array($mValue))
  6.                 {
  7.                         $mValue = array_unique_recursive($mValue, $bUnsetEmpty, $rgStack);
  8.                         if($bUnsetEmpty && !count($mValue))
  9.                         {
  10.                                 unset($rgData[$mKey]);
  11.                         }
  12.                 }
  13.                 elseif(in_array($mValue, $rgStack))
  14.                 {
  15.                         unset($rgData[$mKey]);
  16.                 }
  17.                 else
  18.                 {
  19.                         $rgStack[]=$mValue;
  20.                 }
  21.         }
  22.         return $rgData;
  23. }
  24.  
  25. $rgData=array(
  26.         array('a', 'b', 'c'),
  27.         array('b', 'd', array('a')),
  28.         array('f', 'x', array('y', 'f'),
  29.         'z',
  30.         'z',
  31.         'x')
  32. );
  33.  
  34. //var_dump(array_unique_recursive($rgData));
  35. //var_dump(array_unique_recursive($rgData, true));


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
kosik82
Отправлено: 25 Июля, 2013 - 22:34:57
Post Id


Гость


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


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




EuGen пишет:
Можно без двойного цикла. Пример для произвольного уровня вложенности:


и где без двойного цикла?
ты в цикле запускаешь функцию, которая содержит цикл.

чем мои 4 строчки хуже?

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

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


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


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


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




kosik82
Тем, что не работает. Тот двойной цикл, который я привёл в первом комментарии, сохраняет структуру исходного массива, тогда как Ваш цикл - нет. Если нет цели сохранять структуру исходного массива, и требуется получить лишь одномерный список уникальных значений - то об этом нужно было сообщить заранее, и тогда дело решается одной функцией array_walk_recursive
Если же говорить о примере с рекурсивной функией, то, очевидно, его главное отличие в том, что функция в нём сработает для вложенности любого уровня.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
kosik82
Отправлено: 25 Июля, 2013 - 22:45:17
Post Id


Гость


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


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




EuGen пишет:
то об этом нужно было сообщить заранее,

я в первом сообщении написал, что требуется: "нужно убрать повторяющиеся значения и вывести в строку."
 
 Top
EuGen Администратор
Отправлено: 25 Июля, 2013 - 23:10:34
Post Id


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


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


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




kosik82 пишет:
нужно убрать повторяющиеся значения

EuGen пишет:
array_unique_recursive

kosik82 пишет:
вывести в строку

EuGen пишет:
var_dump

Хотя, наверное, можно было интерпретировать как обычную строку без сохранения структуры. Для этого, повторюсь, подойдёт array_walk_recursive:
PHP:
скопировать код в буфер обмена
  1. $rgData=array(
  2.         array('a', 'b', 'c'),
  3.         array('b', 'd', array('a')),
  4.         array('f', 'x', array('y', 'f'),
  5.         'z',
  6.         'z',
  7.         'x')
  8. );
  9.  
  10. $rgResult = [];
  11. array_walk_recursive($rgData, function($sItem) use (&$rgResult)
  12. {
  13.         return in_array($sItem, $rgResult)?null:$rgResult[]=$sItem;
  14. });
  15. echo join(' ', $rgResult);


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB