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]   

> Без описания
wert
Отправлено: 20 Сентября, 2010 - 15:21:20
Post Id


Новичок


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


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




Подскажите пожалуйста, знающие люди как можно убрать повторение из многомерного массива
Есть функция которая обрабатывает массив рекурсивно и строит новый массив

PHP:
скопировать код в буфер обмена
  1.  
  2. function bra($array_tree, $cid)
  3. {
  4.         foreach($array_tree as $pid => $root)
  5.         {
  6.                 foreach($root as $id => $name)
  7.                 {
  8.                         if($id == $cid)
  9.                         {
  10.                                 bra($array_tree, $pid);
  11.                                 $tree[$id][$pid] = $name;
  12.                         }
  13.                 }
  14.         }
  15.         echo '<pre>'; print_r($tree); echo '</pre>';
  16. }
  17.  

сложность в том что тут рекурсия и я не знаю как можно сделать проверку на повторение
это вывод от echo '<pre>'; print_r($tree); echo '</pre>';

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [1] => Array
  4.         (
  5.             [0] => Категория 1
  6.         )
  7. )
  8. (
  9.     [22] => Array
  10.         (
  11.             [1] => Под категория 2
  12.         )
  13. )
  14. (
  15.     [25] => Array
  16.         (
  17.             [22] => Название 1
  18.         )
  19. )
  20. (
  21.     [1] => Array
  22.         (
  23.             [0] => Категория 1
  24.         )
  25. )
  26. (
  27.     [22] => Array
  28.         (
  29.             [1] => Под категория 2
  30.         )
  31. )
  32. (
  33.     [26] => Array
  34.         (
  35.             [22] => Название 2
  36.         )
  37. )
  38. (
  39.     [1] => Array
  40.         (
  41.             [0] => Категория 1
  42.         )
  43. )
  44. (
  45.     [22] => Array
  46.         (
  47.             [1] => Под категория 2
  48.         )
  49. )
  50. (
  51.     [34] => Array
  52.         (
  53.             [22] => Под категория 3
  54.         )
  55. )
  56. (
  57.     [41] => Array
  58.         (
  59.             [34] => Название 3
  60.         )
  61. )

вывод получается вот такой

- Категория 1
- - Под категория 2
- - - Название 1

- Категория 1
- - Под категория 2
- - - Название 2

- Категория 1
- - Под категория 2
- - Под категория 3
- - - Название 3

а нужно вот так и в этом вся загвоздка у меня

- Категория 1
- - Под категория 2
- - - Название 1
- - - Название 2
- - Под категория 3
- - - Название 3
 
 Top
JustUserR
Отправлено: 20 Сентября, 2010 - 17:30:05
Post Id



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


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


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




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


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
wert
Отправлено: 21 Сентября, 2010 - 00:25:14
Post Id


Новичок


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


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




JustUserR пишет:
вы поочередно просматриваете элементы массива заданного уровня и копируете их в новый массив

JustUserR Возможно ли показать это на примере, просидел так и не получилось у меня

Просидел ешё три часа перебрал все функции с работой массива http://www.php.su/functions/?cat=array
И теперь полностью упёрся в степу, не знаю что делать array_unique тут не работает так как тут рекурсия, сделать как советует JustUserR просто не знаю как, желательно пример для ломанья моей стены не понимания.

(Отредактировано автором: 21 Сентября, 2010 - 02:08:56)

 
 Top
JustUserR
Отправлено: 21 Сентября, 2010 - 12:02:40
Post Id



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


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


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




wert пишет:
JustUserR Возможно ли показать это на примере, просидел так и не получилось у меня
Для огранизации выборки уникальных элементов из многомерного массива необходимо определить требуемый критерий и способ вложенности элементов - в таком случае можно явно указать каким образом будет работать соответствующий алгоритм
Если в вашем случае необходимо произвести отсеивание элементов с одинаковым именем второго уровня без дифференциации по вложенности элементов - то можно использоват такую подпрограмму для вашего массива $tree Несмотря на то что в общем случае она предполагает использование цикла 4 уровня - но при хранении ключей второго уровня в уникальном режиме будут использоваться только два цикла - поскольку локальные массивы ключей будут содержать только один элемкент
PHP:
скопировать код в буфер обмена
  1. $new_tree=array();
  2. for($i=0;$i<count($tree);$i++)
  3. {$cv_elm=array_keys($tree[$i]);
  4. for($k=0;$k<count($cv_elm);$k++)
  5. {$cp_stat=true;
  6. for($m=0;$m<count($new_tree);$m++)
  7. {$nv_elm=array_keys($new_tree[$m]);
  8. for($n=0;$n<count($nv_elm);$n++)
  9. {if($nv_elm[$n]==$cv_elm[$k])
  10. {$cp_stat=false}
  11. else {}
  12. }
  13. }
  14. if($cp_stat) {$new_tree[]=array($cv_elm[$k]=>$tree[$i][$cv_elm[$k]]);}
  15. else {}
  16. }
  17. }
В случае если вы осуществляете поиск повторяющихся элементов с рекурсией - то в таком случае необходимо построит древесную структуру по уникальным ключевым элементам - и в таком случае в процессе построения все повторяющиеся элементы будут автоматически перезаписаны


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
wert
Отправлено: 21 Сентября, 2010 - 18:36:08
Post Id


Новичок


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


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




JustUserR Спасибо за пример нашел для себя интересные моменты которых не знал

и прочитав
Цитата:
необходимо построит древесную структуру по уникальным ключевым элементам - и в таком случае в процессе построения все повторяющиеся элементы будут автоматически перезаписаны

решил всё таки сделать как ты советуеш.

(Отредактировано автором: 21 Сентября, 2010 - 18:36:25)

 
 Top
JustUserR
Отправлено: 22 Сентября, 2010 - 00:05:45
Post Id



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


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


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




wert пишет:
JustUserR Спасибо за пример нашел для себя интересные моменты которых не знал и прочитав решил всё таки сделать как ты советуеш.
Пожалуйста! Для обработки информации хранимой в определенной структуре данных всегда можно разработать различые алгоритмы которые выполняюут требуемую функиональность - однако для удобства используемая структура элементов должна отражать сущность хранимой в ней информации В частности для наборов вложенных объектов удобно использовать древесную структуру - в таком случае каждый хранимых в ней элемент имеет однозначно-определяемый уровень вложенности для которого можно определять однородные ограничения Удобной является схема с представлением дерева в виде ассоциативного массива - когда каждый ключ представляет собой уникальный идентификатор а значения является массивом дочерних элементов - в таком случае для получения реальной информации используется связывающих компоненты идентификатор - а фильтрация одноименных элементов одного узла происходит автоматически с заменой на последнее значений


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
wert
Отправлено: 22 Сентября, 2010 - 02:01:13
Post Id


Новичок


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


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




я пробовал сделать всеми мысленными и не мысленными способами и пришел к выводу что мне нужно, преобразовать многомерный массив в ассоциативный
То есть у меня сейчас вывод вот такой
PHP:
скопировать код в буфер обмена
  1. Array([0] => Категория 1)
  2. Array([1] => Под категория 2)
  3. Array([22] => Название 1)
  4. Array([0] => Категория 1)
  5. Array([1] => Под категория 2)
  6. Array([22] => Название 2)
  7. Array([0] => Категория 1)
  8. Array([1] => Под категория 2)
  9. Array([22] => Под категория 3)
  10. Array([34] => Название 3)

а как получить во такой вывод массива
PHP:
скопировать код в буфер обмена
  1. [0] => Категория 1
  2. [1] => Под категория 2
  3. [22] => Название 1
  4. [0] => Категория 1
  5. [1] => Под категория 2
  6. [22] => Название 2
  7. [0] => Категория 1
  8. [1] => Под категория 2
  9. [22] => Под категория 3
  10. [34] => Название 3
  11. )

Как бы получается сделать из первого варианта второй вариант

(Отредактировано автором: 23 Сентября, 2010 - 12:40:37)

 
 Top
Ch_chov
Отправлено: 22 Сентября, 2010 - 06:03:03
Post Id



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


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


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




http://php.net/manual/en/functio...array-unique.php

Посмотри в комментариях функции для многомерного массива.
 
 Top
wert
Отправлено: 22 Сентября, 2010 - 23:16:02
Post Id


Новичок


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


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




Переводил долго и упорно что там написано, и так и не нашел там примера для своего случая.
 
 Top
XelaNimed
Отправлено: 23 Сентября, 2010 - 10:54:46
Post Id


Частый гость


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


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




wert пишет:
а как получить во такой вывод массива

такой массив невозможен в теории, так как Вы написали, он имеет одинаковые ключи. Если Вы попытаетесь сохранить в один массив все что Вы написали, то останется лишь последнее добавленное значение. Т.е. в Вашем случае:
PHP:
скопировать код в буфер обмена
  1. [0] => Категория 1
  2. [1] => Под категория 2
  3. [22] => Название 1
  4. [0] => Категория 1
  5. [1] => Под категория 2
  6. [22] => Название 2
  7. [0] => Категория 1
  8. [1] => Под категория 2
  9. [22] => Под категория 3
  10. [34] => Название 3
  11. )

Сохраняете [22] => Название 1, затем это значение перезаписываете [22] => Название 2 и еще раз [22] => Название 3
В итоге у Вас остается лишь [22] => Название 3
 
 Top
wert
Отправлено: 23 Сентября, 2010 - 12:33:44
Post Id


Новичок


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


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




XelaNimed пишет:
такой массив невозможен в теории, так как Вы написали, он имеет одинаковые ключи. Если Вы попытаетесь сохранить в один массив все что Вы написали, то останется лишь последнее добавленное значение. Т.е. в Вашем случае:

у меня вывод вот такой
PHP:
скопировать код в буфер обмена
  1. Array([0] => Категория 1)
  2. Array([1] => Под категория 2)
  3. Array([22] => Название 1)
  4. Array([0] => Категория 1)
  5. Array([1] => Под категория 2)
  6. Array([22] => Название 2)
  7. Array([0] => Категория 1)
  8. Array([1] => Под категория 2)
  9. Array([22] => Под категория 3)
  10. Array([34] => Название 3)

а у меня не как не получается сделать вот такой массив из первого массива
PHP:
скопировать код в буфер обмена
  1. [0] => Категория 1
  2. [1] => Под категория 2
  3. [22] => Название 1
  4. [0] => Категория 1
  5. [1] => Под категория 2
  6. [22] => Название 2
  7. [0] => Категория 1
  8. [1] => Под категория 2
  9. [22] => Под категория 3
  10. [34] => Название 3
  11. )

а в итоге у меня получится вот так (3 массив) что мне и нужно, но я не знаю как и первого массива сделать чтобы он был как второй а третий массив у меня получается автаматически, так как одинаковые ключей не будет, они мне и не нужны
PHP:
скопировать код в буфер обмена
  1. [0] => Категория 1
  2. [1] => Под категория 2
  3. [22] => Под категория 3
  4. [34] => Название 3
  5. )

(Отредактировано автором: 23 Сентября, 2010 - 12:40:11)

 
 Top
JustUserR
Отправлено: 23 Сентября, 2010 - 16:30:26
Post Id



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


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


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




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


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB