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]   

> Без описания
3d_killer
Отправлено: 06 Декабря, 2014 - 14:51:44
Post Id



Участник


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


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




массивы одномерные (количество неизвестно)
например
PHP:
скопировать код в буфер обмена
  1. $a=array('a1','a2','a3');
  2. $b=array('b1','b2','b3');
  3. $c=array('c1','c2','c3');


Нужно получить

PHP:
скопировать код в буфер обмена
  1. $d[0]=array('a1','b1',c1');
  2. $d[1]=array('a1','b1',c2');
  3. $d[2]=array('a1','b1',c3');
  4. $d[3]=array('a1','b2',c1');
  5. $d[4]=array('a1','b2',c2');
  6. $d[5]=array('a1','b2',c3');
  7. $d[6]=array('a1','b3',c1');
  8. $d[7]=array('a1','b3',c2');
  9. $d[8]=array('a1','b3',c3');
  10. $d[9]=array('a2','b1',c1');
  11. $d[10]=array('a2','b1',c2');
  12. $d[11]=array('a2','b1',c3');
  13. $d[12]=array('a2','b2',c1');
  14. $d[13]=array('a2','b2',c2');
  15. $d[14]=array('a2','b2',c3');
  16. $d[15]=array('a2','b3',c1');
  17. $d[16]=array('a2','b3',c2');
  18. $d[17]=array('a2','b3',c3');
  19. $d[18]=array('a3','b1',c1');
  20. $d[19]=array('a3','b1',c2');
  21. $d[20]=array('a3','b1',c3');
  22. $d[21]=array('a3','b2',c1');
  23. $d[22]=array('a3','b2',c2');
  24. $d[23]=array('a3','b2',c3');
  25. $d[24]=array('a3','b3',c1');
  26. $d[25]=array('a3','b3',c2');
  27. $d[26]=array('a3','b3',c3');
 
My status
 Top
dXdYdZ
Отправлено: 06 Декабря, 2014 - 19:03:07
Post Id


Посетитель


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


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




Не известно количество элементов в массивах, или количество самих массивов?

(Отредактировано автором: 06 Декабря, 2014 - 19:05:48)

 
 Top
3d_killer
Отправлено: 06 Декабря, 2014 - 19:29:10
Post Id



Участник


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


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




и того и того
просто правильнее было написать мне не $a $b $c, а $array[0],$array[1],$array[2]
(Добавление)
подробнее опишу:
$array это массив параметров например рост, вес, цвет (их может быть много)
у параметров есть значения неизвестное количество, например цвет- черный белый красный
и необходимо составить все вариации данного товара и записать
 
My status
 Top
dXdYdZ
Отправлено: 06 Декабря, 2014 - 20:21:32
Post Id


Посетитель


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


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




Ну, с ходу вот так получается. Хотя не факт, что это лучший вариант
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  
  4. $a=array('a1','a2','a3');
  5. $b=array('b1','b2','b3');
  6. $c=array('c1','c2','c3');
  7.  
  8. $params=array($a,$b,$c);
  9.  
  10. $res=array();
  11.  
  12. function recurs($params,$num,$sub_res,&$res)
  13.         {
  14.         foreach($params[$num] as $pos=>$sub_param)
  15.                 {
  16.                 $sub_res1=$sub_res;
  17.                 $sub_res1[]=$sub_param;
  18.                 if($num==count($params)-1)
  19.                         {
  20.                         $res[]=$sub_res1;
  21.                         }
  22.                 else
  23.                         recurs($params,$num+1,$sub_res1,$res);
  24.                 }
  25.         }
  26.  
  27. recurs($params,0,array(),$res);
  28.  
  29. var_dump($res);
 
 Top
3d_killer
Отправлено: 07 Декабря, 2014 - 02:51:08
Post Id



Участник


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


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




вроде да, благодарю
 
My status
 Top
Bio man
Отправлено: 07 Декабря, 2014 - 04:04:05
Post Id


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


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


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




Есть получше вариант http://forum.php.su/topic.php?fo...96081#1345196081
Называется Декартово произведение множеств (или кортежей).

Сделал на основе реализации от EuGen небольшой класс.

PHP:
скопировать код в буфер обмена
  1. class Tuple extends ArrayIterator {}
  2. class TupleCollection extends SplDoublyLinkedList {}

PHP:
скопировать код в буфер обмена
  1. class CartesianSetsProducer
  2. {
  3.     private $_tupleCollection;
  4.  
  5.     public function __construct()
  6.     {
  7.         $this->_tupleCollection = new TupleCollection();
  8.     }
  9.  
  10.     /*
  11.      * Adds Tuple to the end of collection
  12.      * @var $tuple the tuple that will be added to collection
  13.      * @return void
  14.      * */
  15.     public function addTuple(Tuple $tuple)
  16.     {
  17.         $this->_tupleCollection->push($tuple);
  18.     }
  19.  
  20.     /*
  21.      * Removes Tuple from the end of collection
  22.      * @return void
  23.      * */
  24.     public function removeTuple()
  25.     {
  26.         $this->_tupleCollection->pop();
  27.     }
  28.  
  29.     /*
  30.      * @return cloned TupleCollection
  31.      * */
  32.     public function getCollection()
  33.     {
  34.         return clone $this->_tupleCollection;
  35.     }
  36.  
  37.     /*
  38.      * Products each Tuple in collection
  39.      * @return TupleCollection that contains all possible variations
  40.      * */
  41.     public function product()
  42.     {
  43.         $collection = $this->getCollection();
  44.  
  45.         if(!$collection->count()) {
  46.             return $collection;
  47.         }
  48.  
  49.         $runtimeCollection = new TupleCollection();
  50.  
  51.         foreach($collection->shift() as $tupleItem) {
  52.             $runtimeCollection->push(new Tuple([$tupleItem]));
  53.         }
  54.  
  55.         foreach($collection as $tuple) {
  56.             $runtimeCollection = $this->productPair($runtimeCollection, $tuple);
  57.         }
  58.  
  59.         return $runtimeCollection;
  60.     }
  61.  
  62.     /*
  63.      * @var $collection is a temporary collection, which tuples needs to be produced with $current tuple
  64.      * @var $current is a tuple passed from $this->_tupleCollection and needs to be produced with $collection
  65.      * @return TupleCollection which contains produced tuples
  66.      * */
  67.     protected function productPair(TupleCollection $collection, Tuple $current)
  68.     {
  69.         $runtimeCollection = new TupleCollection();
  70.  
  71.         foreach($collection as $tuple) {
  72.             foreach($current as $tupleItem) {
  73.                 $merged = array_merge((array)$tuple, (array)$tupleItem);
  74.                 $runtimeCollection->push(new Tuple($merged));
  75.             }
  76.         }
  77.  
  78.         return $runtimeCollection;
  79.     }
  80. }

Использование
PHP:
скопировать код в буфер обмена
  1. $producer = new CartesianSetsProducer();
  2. $producer->addTuple(new Tuple(['a1','a2','a3']));
  3. $producer->addTuple(new Tuple(['b1','b2','b3']));
  4. $producer->addTuple(new Tuple(['c1','c2','c3']));
  5.  
  6. $result = $producer->product();
  7.  
  8. $producer->addTuple(new Tuple(['d1','d2','d3']));
  9.  
  10. $result2 = $producer->product();
  11.  
  12. var_dump($result->count());
  13.  
  14. var_dump($result2->count());



P.S. не обращайте внимания на мой английский, он очень слабый.

(Отредактировано автором: 07 Декабря, 2014 - 04:07:42)

 
 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