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 :: Все возможные комбинации элементво массива [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: кроме элементов с одинаковыми индексами
NoPaper
Отправлено: 26 Июля, 2012 - 23:00:32
Post Id



Посетитель


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


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




PVG пишет:
А можно как-то создать массив функций?

только если
$f = array(
create_function...
);

и потом вызвать

$f[n]();
 
 Top
tuareg
Отправлено: 27 Июля, 2012 - 06:30:27
Post Id


Участник


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


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




PHP:
скопировать код в буфер обмена
  1.  
  2.  $a1 = array('минута00','час00');
  3.  $a2 = array('минута0','час0');
  4. $a3 = array('минута1','час1');
  5.  

Какой результат должен быть? Если такой
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. минута00+час00
  3. минута00+час0
  4. минута0+час00
  5. минута0+час0
  6. час00+минута00
  7. час00+минута0
  8. час0+минута0
  9. час0+минута00
  10. минута1+час1
  11. ...
  12.  

То собирайте все массивы в один
PHP:
скопировать код в буфер обмена
  1.  
  2. $a1 = array('минута00','час00');
  3. $a2 = array('минута0','час0');
  4. $a3 = array('минута1','час1');
  5. #Тут все собираем в один массив
  6. $globArr=array('минута00','час00','минута0','час0','минута1','час1');
  7. $count=count($globArr);
  8. for($i=0;$i<$count;$i++){
  9.   for($j=0;$j<$count;$j++){
  10.     if($i==$j) continue;
  11.      $newArr[]=$globArr[$i].'+'.$globArr[$j];
  12.   }
  13. }
  14.  

Теоретически должно получиться. Улыбка

(Отредактировано автором: 27 Июля, 2012 - 07:02:59)

 
 Top
EuGen Администратор
Отправлено: 27 Июля, 2012 - 09:10:53
Post Id


Профессионал


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


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




PHP:
скопировать код в буфер обмена
  1. function decartProduct($rgArg0, $rgArg1, $bIncludeSimilar=true)
  2. {
  3.    $rgResult=array();
  4.    for($i=0; $i<count($rgArg0); $i++)
  5.    {
  6.       for($j=0; $j<count($rgArg1); $j++)
  7.       {
  8.          if($bIncludeSimilar || $i!=$j)
  9.          {
  10.             $rgResult[]=array_merge((array)$rgArg0[$i], (array)$rgArg1[$j]);
  11.          }
  12.       }
  13.    }
  14.    return $rgResult;
  15. }
  16. function createAssotiation()
  17. {
  18.    $rgArgs   = func_get_args();
  19.    if(!count($rgArgs))
  20.    {
  21.       return array();
  22.    }
  23.    $rgResult = array_shift($rgArgs);
  24.    while($rgArg=array_shift($rgArgs))
  25.    {
  26.       $rgResult=decartProduct($rgResult, $rgArg, false);
  27.    }
  28.    return $rgResult;
  29. }
  30. $rgArg0=array('a', 'b', 'c', 'd');
  31. $rgArg1=array('e', 'f', 'g', 'h');
  32. $rgArg2=array('i', 'j', 'k', 'l');
  33. $rgResult=createAssotiation($rgArg0, $rgArg1, $rgArg2);
  34. //var_dump($rgResult);

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
tuareg
Отправлено: 27 Июля, 2012 - 09:19:36
Post Id


Участник


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


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




EuGen нет. Даже тестовый вариант в первом сообщении выдает только 2 результата.
 
 Top
EuGen Администратор
Отправлено: 27 Июля, 2012 - 09:22:49
Post Id


Профессионал


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


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




tuareg
Это потому, что задача поставлена не совсем корректно. Не очень понятно, что с чем сравнивать и как в результат должны включаться изначальные массивы (а суда по приведенному примеру результата - должны), если, например, размерность каждого массива не совпадает с числом массивов. Если совпадает - то все просто, достаточно в createAssotiation добавить исходные аргументы членами результирующего массива. Но если нет - ясность теряется.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
tuareg
Отправлено: 27 Июля, 2012 - 09:26:40
Post Id


Участник


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


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




Да согласен. Я запустил свой код. У меня получилось
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => минута00+час00
  4.     [1] => минута00+минута0// вот это лишнее
  5.     [2] => минута00+час0
  6.     [3] => час00+минута00
  7.     [4] => час00+минута0
  8.     [5] => час00+час0// вот это лишнее
  9.     [6] => минута0+минута00// вот это лишнее
  10.     [7] => минута0+час00
  11.     [8] => минута0+час0
  12.     [9] => час0+минута00
  13.     [10] => час0+час00// вот это лишнее
  14.     [11] => час0+минута0
  15. )
  16.  

Нужна более точная ясность
(Добавление)
Если я правильно понял Улыбка вот решение
PHP:
скопировать код в буфер обмена
  1.  
  2. $rgArgStart=array(array('минута00','час00'),array('минута0','час0'),array('минута1','час1'));
  3. $count=count($rgArgStart);
  4. for($i=0;$i<$count;$i++){
  5.         for($j=0;$j<$count;$j++){
  6.                 $rgResult[]=$rgArgStart[$i][0].'+'.$rgArgStart[$j][1];
  7.                 $rgResult[]=$rgArgStart[$i][1].'+'.$rgArgStart[$j][0];
  8.         }
  9. }
  10. echo '<pre>';
  11.  print_r($rgResult);
  12. echo '</pre>';
  13.  

Для массива из первого поста совпадение 100%.
Для трех
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => минута00+час00
  4.     [1] => час00+минута00
  5.     [2] => минута00+час0
  6.     [3] => час00+минута0
  7.     [4] => минута00+час1
  8.     [5] => час00+минута1
  9.     [6] => минута0+час00
  10.     [7] => час0+минута00
  11.     [8] => минута0+час0
  12.     [9] => час0+минута0
  13.     [10] => минута0+час1
  14.     [11] => час0+минута1
  15.     [12] => минута1+час00
  16.     [13] => час1+минута00
  17.     [14] => минута1+час0
  18.     [15] => час1+минута0
  19.     [16] => минута1+час1
  20.     [17] => час1+минута1
  21. )
  22.  

(Добавление)
Вот еще вариант когда массив
PHP:
скопировать код в буфер обмена
  1.  
  2. array('минута00','час00','день00'),
  3.  

PHP:
скопировать код в буфер обмена
  1.  
  2. $rgArgStart=array(array('минута00','час00','день00'),array('минута0','час0','день0'));//,array('минута1','час1')
  3. $count=count($rgArgStart);
  4.         for($i=0;$i<$count;$i++){
  5.                 $tempCount=count($rgArgStart[$i]);
  6.                 for($j=0;$j<$count;$j++){
  7.                         for($j1=0;$j1<$tempCount;$j1++){/*j1 текущий индекс*/
  8.                                 $strResult='';
  9.                                 for($j2=0;$j2<$tempCount;$j2++){
  10.                                         if($j2==$j1) continue;
  11.                                         $strResult.='+'.$rgArgStart[$j][$j2];
  12.                                 }
  13.                                 $rgResult[]=$rgArgStart[$i][$j1].$strResult;
  14.                         }
  15.                 }
  16.         }
  17. echo '<pre>';
  18.  print_r($rgResult);
  19. echo '</pre>';
  20.  
 
 Top
PVG
Отправлено: 27 Июля, 2012 - 12:32:45
Post Id


Гость


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


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




Что если создать для начала функцию которая перемешивает два массива.
А затем в исходный массив, который содержит минута0 и минута00 добавить 1 элемент - час0 и перемешать два массива (1-й содержит минута0 и минута00, а второй час0), а затем резльтат полученный записать снова в исходный массив и получим что-то типа того:
arrayRez (
1 => 'минута0+минута00
2 => 'минута0 + час0'
3 => минута00+час0');
Затем создать еще 1 массив, который содержит только час00 и по тому же принципу перемешать с массивом arrayRez и т.д.

Или вводить по 2 элемента...

P.S.: Извините что не в коде, что-то не тяну(
 
 Top
NoPaper
Отправлено: 28 Июля, 2012 - 21:53:12
Post Id



Посетитель


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


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




tuareg пишет:

Вот еще вариант когда массив
PHP:
скопировать код в буфер обмена
  1.  
  2. $rgArgStart=array(array('минута00','час00','день00'),array('минута0','час0','день0'));//,array('минута1','час1')
  3. $count=count($rgArgStart);
  4.         for($i=0;$i<$count;$i++){
  5.                 $tempCount=count($rgArgStart[$i]);
  6.                 for($j=0;$j<$count;$j++){
  7.                         for($j1=0;$j1<$tempCount;$j1++){/*j1 текущий индекс*/
  8.                                 $strResult='';
  9.                                 for($j2=0;$j2<$tempCount;$j2++){
  10.                                         if($j2==$j1) continue;
  11.                                         $strResult.='+'.$rgArgStart[$j][$j2];
  12.                                 }
  13.                                 $rgResult[]=$rgArgStart[$i][$j1].$strResult;
  14.                         }
  15.                 }
  16.         }
  17. echo '<pre>';
  18.  print_r($rgResult);
  19. echo '</pre>';
  20.  


Спасибо огромное, как раз этот код подошел!

(Отредактировано автором: 28 Июля, 2012 - 22:11:12)

 
 Top
tuareg
Отправлено: 28 Июля, 2012 - 21:58:05
Post Id


Участник


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


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




Я рад Улыбка . На будущее попробуйте внятней формировать ТЗ. А то час думал как Вам помочь.
 
 Top
NoPaper
Отправлено: 28 Июля, 2012 - 22:04:41
Post Id



Посетитель


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


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




tuareg пишет:
Я рад Улыбка . На будущее попробуйте внятней формировать ТЗ. А то час думал как Вам помочь.

Вот уже который раз пересматриваю код, и никак не могу вникнуть в алгоритм... можете объяснить принцип работы? Заранее спасибо Закатив глазки

(Отредактировано автором: 28 Июля, 2012 - 22:05:11)

 
 Top
LIME
Отправлено: 28 Июля, 2012 - 22:08:37
Post Id


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


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


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





tuareg АААХАХАХА)))
я плачу))
давай))....объясняй))
я тоже послушаю))

(Добавление)
и почему у тебя первыя строчка в воздух ушла?)))
(Добавление)
ой)) эт у него ушла) сорь)
 
 Top
tuareg
Отправлено: 28 Июля, 2012 - 22:15:40
Post Id


Участник


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


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




Сейчас с мыслями соберусь. Радость

Тут без бутылки не разберешься
 
 Top
LIME
Отправлено: 28 Июля, 2012 - 22:22:21
Post Id


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


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


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





бросай)) неблагодарная затея))
NoPaper вы пока примите как есть)) тут решить надо думать а объяснять и вовсе ))...
 
 Top
NoPaper
Отправлено: 28 Июля, 2012 - 22:25:09
Post Id



Посетитель


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


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




LIME пишет:

бросай)) неблагодарная затея))
NoPaper вы пока примите как есть)) тут решить надо думать а объяснять и вовсе ))...


ладненько, буду разбираться)))

все равно, всем спасибо за предоставленное решение Улыбка

(Отредактировано автором: 28 Июля, 2012 - 22:26:15)

 
 Top
tuareg
Отправлено: 28 Июля, 2012 - 22:26:23
Post Id


Участник


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


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




Все просто. Я умными словами говорить не умею, так что не обессудьте. Радость
Сначала сформировали глобальный массив.
Начали его перебирать. // первый цикл
Каждый элемент массива, мы перебираем со всем массивом //второй цикл
Т.к мы знаем, что нам надо перебрать массив, т.о что получит все возможные комбинации, за исключением совпадения по индексам
Просто пример
1 2 3
4 5 6
Надо получить
123
156

213
246

321
345

423
456

513
546

612
645
Вот и пошли перебирать, смотрим чтобы не совпали индексы. Как раз 3 и 4 цикл.
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB