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]   

> Без описания
dmaw
Отправлено: 25 Августа, 2014 - 13:59:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


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




Для меня задача получилась непосильной, сижу почти месяц (по большей части время убиваю), не могу просчитать, хоть и кажется всё не так сложно)

Мне нужно из многомерного массива получить все возможные комбинации. Для наглядного восприятия я даже нашел себе картинку Улыбка

Есть массив, внутри массивы (группы чисел или текстовых данных):
PHP:
скопировать код в буфер обмена
  1.  
  2. $arr = array(
  3.         array(10, 15, 20),//группа 1
  4.         array(1, 2), //группа 2
  5.         array(5, 6), //группа 3
  6.         array(777)//группа 4
  7. );//может содержать до 200 групп
  8.  


По сути должно получиться как-то так (для удобства чтения добавил дефисы):

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 10 - 1 - 5 - 777
  3. 10 - 2 - 5 - 777
  4. 10 - 1 - 6 - 777
  5. 10 - 2 - 6 - 777
  6.  
  7. 15 - 1 - 5 - 777
  8. 15 - 2 - 5 - 777
  9. 15 - 1 - 6 - 777
  10. 15 - 2 - 6 - 777
  11.  
  12. 20 - 1 - 5 - 777
  13. 20 - 2 - 5 - 777
  14. 20 - 1 - 6 - 777
  15. 20 - 2 - 6 - 777
  16.  
 
 Top
dcc0
Отправлено: 25 Августа, 2014 - 14:53:15
Post Id


Участник


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


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




С одномерным массивом нашел. На всякий случай:
http://docstore[dot]mik[dot]ua/orelly/we[dot][dot][dot]cook/ch04_26[dot]htm
Искал в Гугле по словам php array permutation
Скрипт рабочий.
в качестве предположения, можно добавить функцию, которая будет брать значение из первой группы массива присовокуплять ко во всем остальным, затем второе и т.д.

(Отредактировано автором: 25 Августа, 2014 - 18:56:43)



-----
Март 2021. Бросил программирование
 
 Top
Ch_chov
Отправлено: 25 Августа, 2014 - 19:15:23
Post Id



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


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


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




PHP:
скопировать код в буфер обмена
  1. $result = array();
  2. $total = count($arr);
  3. while(true) {
  4.  
  5.         $row = array();
  6.         foreach ($arr as $key => $value) {
  7.                 $row[] = current($value);
  8.         }
  9.         $result[] = implode('-', $row);
  10.  
  11.         for ($i = $total - 1; $i >= 0; $i--) {
  12.                 if (next($arr[$i])) {
  13.                         break;
  14.                 }
  15.                 elseif ($i == 0) {
  16.                          break 2;
  17.                 }
  18.                 else {
  19.                         reset($arr[$i]);
  20.                 }
  21.         }
  22.  
  23. }
  24.  
  25. print_r($result);


CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => 10-1-5-777
  3.     [1] => 10-1-6-777
  4.     [2] => 10-2-5-777
  5.     [3] => 10-2-6-777
  6.     [4] => 15-1-5-777
  7.     [5] => 15-1-6-777
  8.     [6] => 15-2-5-777
  9.     [7] => 15-2-6-777
  10.     [8] => 20-1-5-777
  11.     [9] => 20-1-6-777
  12.     [10] => 20-2-5-777
  13.     [11] => 20-2-6-777
  14. )
  15.  
 
 Top
dmaw
Отправлено: 25 Августа, 2014 - 22:38:48
Post Id



Частый гость


Покинул форум
Сообщений всего: 227
Дата рег-ции: Сент. 2009  
Откуда: Беларусь, Витебск


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




Ch_chov, волшебник! Спасибо!
Я бы так не написал :)
Спасибо!
 
 Top
dcc0
Отправлено: 25 Августа, 2014 - 23:23:37
Post Id


Участник


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


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




Действительно круто.
reset, как я понял, переводит указатель в начало массива.
А вот эту строчку не понимаю, что-то магическое:

CODE (htmlphp):
скопировать код в буфер обмена
  1. if (next($arr[$i])) {
  2.                         break;


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

(Отредактировано автором: 25 Августа, 2014 - 23:26:15)



-----
Март 2021. Бросил программирование
 
 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