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


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

> Без описания
potap1986
Отправлено: 18 Мая, 2012 - 22:50:31
Post Id


Новичок


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


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




Есть 3 массива:

$array1 = array(key => 1, key2 => 2, key3 => 3);
$array2 = array(key => 4);
$array3 = array(key => 5, key2 => 6);

Как мне получить все возможные варианты значений между ними.
Должно получиться:
1-4-5
1-4-6
2-4-5
2-4-6
3-4-5
3-4-6

Подскажите пожалуйста.
 
 Top
OrmaJever Модератор
Отправлено: 18 Мая, 2012 - 23:21:31
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




самое простое это 3 сложеных друг в друга цикла, но можно заморочится и через рекурсию.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Bio man
Отправлено: 18 Мая, 2012 - 23:32:02
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Мозг кипит! Через 3 цикла сделал, щас ломаю голову над рекурсией.
 
 Top
Alho
Отправлено: 19 Мая, 2012 - 00:05:46
Post Id



Посетитель


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


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




Через циклы легко:
PHP:
скопировать код в буфер обмена
  1. function getallcomb($array1, $array2, $array3)
  2. {
  3.         foreach ($array1 as $key1 =>$val1) {
  4.         foreach ($array2 as $key2 =>$val2) {
  5.                 foreach ($array3 as $key4 =>$val3) {
  6.                         $out[]=array($val1, $val2, $val3);
  7.                 }
  8.         }
  9. }
  10. return $out;
  11. }
  12. $array1 = array(key => 1, key2 => 2, key3 => 3);
  13. $array2 = array(key => 4);
  14. $array3 = array(key => 5, key2 => 6);
  15. print_r(getallcomb($array1, $array2, $array3));
  16. ?>


Черд. Помогите сделать. Никак не могу придумать через рекурсию Нахмурился

(Отредактировано автором: 19 Мая, 2012 - 00:29:14)

 
 Top
Bio man
Отправлено: 19 Мая, 2012 - 00:08:52
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Alho пишет:
Никак не могу придумать через рекурсию
Такая же фигня. Кстати в твоем примере $i не нужен.
PHP:
скопировать код в буфер обмена
  1. function variations(array $rgElements){
  2.         $rgResult = array();
  3.         foreach($rgElements[0] as $item1){
  4.                 foreach($rgElements[1] as $item2){
  5.                         foreach($rgElements[2] as $item3){
  6.                                 $rgResult[] = array($item1, $item2, $item3);
  7.                         }
  8.                 }
  9.         }
  10.         return $rgResult; // array(i=>array,...)
  11. }
  12.  
  13. $array1 = array('key' => 1, 'key2' => 2);
  14. $array2 = array('key' => 4);
  15. $array3 = array('key' => 5, 'key2' => 6, 'key3' => 3);
  16.  
  17. $a = variations(array($array1, $array2, $array3));

(Отредактировано автором: 19 Мая, 2012 - 00:10:21)

 
 Top
LIME
Отправлено: 19 Мая, 2012 - 00:13:24
Post Id


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


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


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




Bio man а рекурсия где?))
(Добавление)
Alho пишет:
Никак не могу придумать через рекурсию
а ты представь что теперь появился еще 1 массив
а потом еще
вот и вызывай рекурсию уменьшая число массивов в аргументе
 
 Top
Bio man
Отправлено: 19 Мая, 2012 - 00:27:43
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




LIME пишет:
Bio man а рекурсия где?))
Я же и говорю, что никак не могу осилить.
LIME, может напишешь рекурсию? А то я пол ночи просижу.
(Добавление)
Как же это сложно! Сдаюсь! Огорчение
 
 Top
LIME
Отправлено: 19 Мая, 2012 - 01:02:42
Post Id


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


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


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




не проверял
лениво))
PHP:
скопировать код в буфер обмена
  1. <?
  2. function variations(array $rgElements){
  3.         $rgResult = array();
  4.         if (count($rgElements)>1) {
  5.                         $rgElements2=$rgElements;
  6.                         array_shif($rgElements2);
  7.                         foreach($rgElements[0] as $item1){
  8.                                 $rgResult[] = array_merge($item1,variations($rgElements2));                            
  9.                         }
  10.                 } else {
  11.                         return $rgElements[0];
  12.                         }
  13.         return $rgResult;
  14. }
  15.  

(Добавление)
нет
кажись лажа
 
 Top
Bio man
Отправлено: 19 Мая, 2012 - 01:14:09
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




LIME пишет:
нет
кажись лажа
Согласись, задачка не из простых. Может кто из профи рассеет туман
 
 Top
potap1986
Отправлено: 19 Мая, 2012 - 01:55:37
Post Id


Новичок


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


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




Нашел решение:
Взято отсюда http://www[dot]sql[dot]ru/forum/actualth[dot][dot][dot][dot]aspx?tid=725312

PHP:
скопировать код в буфер обмена
  1. $a = array (
  2.     array ("a", "b", "c"),
  3.     array ("d", "f"),
  4.     array ("g", "k")
  5. );
  6.  
  7.  
  8. function fill (&$arr, $idx = 0) {
  9.     static $line = array();
  10.     static $keys;
  11.     static $max;
  12.     static $results;
  13.     if ($idx == 0) {
  14.         $keys = array_keys($arr);
  15.         $max = count($arr);
  16.         $results = array();
  17.     }
  18.     if ($idx < $max) {
  19.         $values = $arr[$keys[$idx]];
  20.         foreach ($values as $value) {
  21.             array_push($line, $value);
  22.             fill($arr, $idx+1);
  23.             array_pop($line);
  24.         }
  25.     } else {
  26.         $results[] = $line;
  27.     }
  28.     if ($idx == 0) return $results;
  29. }
  30.  
  31. print_r(fill($a));


Все работет.
Всем спасибо за помощь.
 
 Top
armancho7777777 Супермодератор
Отправлено: 17 Августа, 2012 - 10:26:19
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Данная функция возвращает не все комбинации массива.
Ну да ладно, тема устарела Улыбка
Но если что, пишите Подмигивание
 
 Top
tuareg
Отправлено: 17 Августа, 2012 - 10:33:42
Post Id


Участник


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


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




armancho7777777 я же писал именно такую ф-ю, тема есть с решением на форуме
 
 Top
Stierus Супермодератор
Отправлено: 17 Августа, 2012 - 10:54:57
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




Цитата:
Как мне получить все возможные варианты значений между ними.
Должно получиться:
1-4-5
1-4-6
2-4-5
2-4-6
3-4-5
3-4-6


Вы определитесь, хотите вы все возможные комбинации или отсортированные?

1-4-5 не то же самое, что 4-1-5
 
My status
 Top
tuareg
Отправлено: 17 Августа, 2012 - 11:34:37
Post Id


Участник


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


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




Все возможные Улыбка
 
 Top
Stierus Супермодератор
Отправлено: 17 Августа, 2012 - 11:37:51
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




Тогда вам нужно привести ваши массивы

$array1 = array(key => 1, key2 => 2, key3 => 3);
$array2 = array(key => 4);
$array3 = array(key => 5, key2 => 6);

к одному

array(key => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5, key6 => 6);

и на этом масиве искать все комбинации.
 
My status
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB