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
Форумы портала PHP.SU :: Версия для печати :: Получить все возможные комбинации из многомерного массива
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Получить все возможные комбинации из многомерного массива

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

1. dmaw - 25 Августа, 2014 - 13:59:37 - перейти к сообщению
Для меня задача получилась непосильной, сижу почти месяц (по большей части время убиваю), не могу просчитать, хоть и кажется всё не так сложно)

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

Есть массив, внутри массивы (группы чисел или текстовых данных):
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.  
2. dcc0 - 25 Августа, 2014 - 14:53:15 - перейти к сообщению
С одномерным массивом нашел. На всякий случай:
http://docstore[dot]mik[dot]ua/orelly/we[dot][dot][dot]cook/ch04_26[dot]htm
Искал в Гугле по словам php array permutation
Скрипт рабочий.
в качестве предположения, можно добавить функцию, которая будет брать значение из первой группы массива присовокуплять ко во всем остальным, затем второе и т.д.
3. Ch_chov - 25 Августа, 2014 - 19:15:23 - перейти к сообщению
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.  
4. dmaw - 25 Августа, 2014 - 22:38:48 - перейти к сообщению
Ch_chov, волшебник! Спасибо!
Я бы так не написал :)
Спасибо!
5. dcc0 - 25 Августа, 2014 - 23:23:37 - перейти к сообщению
Действительно круто.
reset, как я понял, переводит указатель в начало массива.
А вот эту строчку не понимаю, что-то магическое:

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


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

 

Powered by ExBB FM 1.0 RC1