Here is a cook that I tried to implement for the selection of combinations:
/** * ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ, ΡΡΠΈΡΡΠ²Π°Ρ Π»ΠΈΠΌΠΈΡ * @param array $items - ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° * @param int $limit - Π»ΠΈΠΌΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ
ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ * @param bool $repeatItems - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ * @param bool $arrayOrDelimiter - TRUE - Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ Π² ΠΎΠ±ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅, Π»ΠΈΠ±ΠΎ Π΄Π΅Π»ΠΈΠΌΠΈΡΠ΅Ρ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΡΡΠΎΠΊΠ΅ * @return array */ function getArr_variants($items = array(), $limit = 5, $repeatItems = false, $arrayOrDelimiter = false) { static $excludeItems = array(); $R = array(); if (!is_array($items)) return array(); if (!$repeatItems && count($items) < $limit) $limit = count($items); /// foreach ($items as $item) { if (isset($excludeItems[$item])) continue; if (!$repeatItems) $excludeItems[$item] = ''; $R[] = $arrayOrDelimiter === true ? array($item) : $item; if ($limit > 1) { foreach ($this->getArr_variants($items, $limit - 1, $repeatItems, $arrayOrDelimiter) as $subItem) { $R[] = $arrayOrDelimiter === true ? array_merge(array($item), $subItem) : $item.$arrayOrDelimiter.$subItem; } } unset($excludeItems[$item]); } /// return $R; }
Example:
print_r( getArr_variants(array('a','b','c','d')) );
Displays:
Array ( [0] => a [1] => ab [2] => abc [3] => abcd [4] => abd [5] => abdc [6] => ac [7] => acb [8] => acbd [9] => acd [10] => acdb [11] => ad [12] => adb [13] => adbc [14] => adc [15] => adcb [16] => b [17] => ba [18] => bac [19] => bacd [20] => bad [21] => badc [22] => bc [23] => bca [24] => bcad .... )