fork download
  1. <?php
  2. function mergeResult($a, $b, $needJoin = true) {
  3. // fixme: увы не хватает времени на допилку...
  4. if (!$needJoin) return array_merge($a, $b);
  5. return array_map(function ($r) use ($a) {
  6. return mergeResult($a, $r, false);
  7. }, $b);
  8. }
  9.  
  10. function buildLevel(array $words, $level) {
  11. // с первым уровнем все просто
  12. if ($level === 1) return [implode(' ', $words)];
  13.  
  14. // со вторым чуть по сложнее...
  15. $result = [];
  16. $chunk = [];
  17. while(count($words) >= $level) {
  18. // отделяем первое слово из "строки" и зановим его к первому "слагаемому"
  19. array_push($chunk, array_shift($words));
  20. $result[] = mergeResult(buildLevel($chunk, 1), buildLevel($words, $level-1), $level > 2);
  21. }
  22. return $result;
  23. }
  24.  
  25. $words = explode(' ', 'a b c d');
  26. // я торопился по сему вот так...
  27. var_export(buildLevel($words, 3));
  28. var_export(buildLevel($words, 4));
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
array (
  0 => 
  array (
    0 => 
    array (
      0 => 'a',
      1 => 'b',
      2 => 'c d',
    ),
    1 => 
    array (
      0 => 'a',
      1 => 'b c',
      2 => 'd',
    ),
  ),
  1 => 
  array (
    0 => 
    array (
      0 => 'a b',
      1 => 'c',
      2 => 'd',
    ),
  ),
)array (
  0 => 
  array (
    0 => 
    array (
      0 => 'a',
      1 => 
      array (
        0 => 'b',
        1 => 'c',
        2 => 'd',
      ),
    ),
  ),
)