Как получить ВСЕ комбинации списка слов, используя ЛЮБОЕ число слов

Я искал, но не могу найти ничего, что соответствует моему запросу. Я видел множество решений, в которых людям нужны все комбинации чисел / слов, которые используют ВСЕ опции, но не такие …

Вот пример:

apple pear 

Это должно генерировать:

яблоко
груша
яблочная груша
грушевое яблоко

Или даже…

 apple pear banana 

яблоко
груша
банан
яблочная груша
яблочный банан
грушевый банан


банановое грушевое яблоко

Ключ: ВСЕ возможные комбинации, которые используют любой из слов ноль или один раз в ЛЮБОМ порядке. 🙂

Related of "Как получить ВСЕ комбинации списка слов, используя ЛЮБОЕ число слов"

ЗАКЛЮЧИТЕЛЬНЫЙ ОТВЕТ НА НОМЕРЕ


Псевдокод (не был протестирован)

 $str = "apple pear banana"; $str_splode = explode(' ',$str); echo showCombo($str_splode[0], $str_splode); function showCombo($str, $arr){ $ret = ''; foreach($arr as $val){ if($val != $str) $ret .= $str.showCombo($val, $arr); } return $ret; } 

Код запуска : http://codepad.org/IUPJbhI7

 <?php $str = "apple pear banana orange"; $str_splode = explode(' ',$str); print_r(showCombo(array(), $str_splode)); function showCombo($str_arr, $arr){ $ret = array(); foreach($arr as $val){ if(!in_array($val, $str_arr)){ $temp = $str_arr; $temp[] = $val; print_r($temp); $comb = showCombo($temp, $arr); if(count($comb) > 0) $ret[] = $comb; } } return $ret; } ?> 

Это возвращает все возможные комбинации


Или этот выглядит лучше: http://codepad.org/KCLeRUYs

 <?php $str = "apple pear banana orange"; $str_splode = explode(' ',$str); print_r(showCombo(array(), $str_splode)); function showCombo($str_arr, $arr){ $ret = array(); foreach($arr as $val){ if(!in_array($val, $str_arr)){ $temp = $str_arr; $temp[] = $val; $ret[$val] = $temp; $ret[$val][] = showCombo($temp, $arr); } } return $ret; } ?> 

Или если вы хотите посмотреть на плоские клавиши: http://codepad.org/95aNQzXB


Окончательный ответ:

И это перечисляет их все: http://codepad.org/vndOI9Yj

 <?php $str = "apple pear banana orange"; $str_splode = explode(' ',$str); $combos = showCombo(array(), $str_splode); foreach($combos as $key=>$array){ echo $key.PHP_EOL; displayArrayByKey($key, $array); } function displayArrayByKey($str, $arr){ foreach($arr as $key=>$array){ $string = $str. " " . $key; echo $string . PHP_EOL; if(count($array)> 0){ displayArrayByKey($string, $array); } } } function showCombo($str_arr, $arr){ $ret = array(); foreach($arr as $val){ if(!in_array($val, $str_arr)){ $temp = $str_arr; $temp[] = $val; $ret[$val] = showCombo($temp, $arr); } } return $ret; } ?> 

Вы можете скачать этот класс: http://pear.php.net/package/Math_Combinatorics

и используйте его так:

 $combinatorics = new Math_Combinatorics; $words_arr = array( 'one' => 'a', 'two' => 'b', 'three' => 'c', 'four' => 'd', ); for ($i=count($words_arr)-1;$i>=1;$i--) { echo '<br><br>' . $i . ':<br>'; $combinations_arr = $combinatorics->combinations($words_arr, $i); foreach ($combinations_arr as $combinations_arr_item) { echo implode(', ', $combinations_arr_item) . '<br>'; } }