How to write a recursive function for the code below?

$arr = array('a', 'b', 'c'); $lim = count($arr); for($i1 = 0; $i1 < $lim; $i1++) { for($i2 = 0; $i2 < $lim; $i2++) { for($i3 = 0; $i3 < $lim; $i3++) { echo $arr[$i1].$arr[$i2].$arr[$i3].'<br>'; } } } 
  • similar to a test or training task :) w hich here php.net/manual/ru/functions.user-defined.php - zenith
  • If so, then suggest an option - Valentin Romanko
  • If you are given an exhaustive answer, mark it as correct (a daw opposite the selected answer). - Nicolas Chabanovsky ♦

2 answers 2

Those. in fact, you need to perform a complete enumeration of all possible combinations of elements of the array. Here it is possible:

 function kuda_mir_katitsa($array, $sequence = '') { // УсловиС остановки рСкурсии - ΠΊΠΎΠ³Π΄Π° Π΄Π»ΠΈΠ½Π° составлСнной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ // Ρ€Π°Π²Π½Π° количСству элСмСнтов Π² нашСм массивС if (strlen($sequence) === count($array)) { echo $sequence . '<br>'; return; } // ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх элСмСнтов Π² нашСм массивС foreach ($array as $item) { // К составлСнной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прицСпляСм ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ символ ΠΈ ныряСм дальшС kuda_mir_katitsa($array, $sequence . $item); } } $arr = array('a', 'b', 'c'); kuda_mir_katitsa($arr); 
  • one
    Thank you very much, good luck in all your endeavors - Valentin Romanko

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 .... )