<?php
function buildLevel(array $words, $level) {
    // с первым уровнем все просто
    if ($level === 1) return [implode(' ', $words)];
    if ($level === 2) {
        // со вторым чуть по сложнее...
        $result = [];
        $chunk = [];
        while(count($words) >= $level) {
        	// отделяем первое слово из "строки" и зановим его к первому "слагаемому"
            array_push($chunk, array_shift($words)); 
            $result[] = array_merge([implode(' ', $chunk)], [implode(' ', $words)]);
        }

        return $result;
    }

    throw new \Exception(sprintf('Not implemented for level %d for now', $level));
}

$words = explode(' ', 'a b c d');
var_dump(buildLevel($words, 1));
var_dump(buildLevel($words, 2));