Я искал, но не могу найти ничего, что соответствует моему запросу. Я видел множество решений, в которых людям нужны все комбинации чисел / слов, которые используют ВСЕ опции, но не такие …
Вот пример:
apple pear
Это должно генерировать:
яблоко
груша
яблочная груша
грушевое яблоко
Или даже…
apple pear banana
яблоко
груша
банан
яблочная груша
яблочный банан
грушевый банан
…
…
банановое грушевое яблоко
Ключ: ВСЕ возможные комбинации, которые используют любой из слов ноль или один раз в ЛЮБОМ порядке. 🙂
ЗАКЛЮЧИТЕЛЬНЫЙ ОТВЕТ НА НОМЕРЕ
Псевдокод (не был протестирован)
$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>'; } }