<?php

function make_regexp($x) {
     $keys = explode(':', $x);
     $last = "(?P<" . array_pop($keys) . ">.+)";
     array_walk($keys, function(&$v, $k) { $v = "(?P<$v>[^:]+)";});
     array_push($keys, $last);
     return '#^' . implode(':', $keys) . '$#';
}

function slice($a, $key) {
    return array_filter($a, function($k)use($key) {return in_array($k, explode(':', $key));}, ARRAY_FILTER_USE_KEY);
}

function f($a) {
    $keys = implode(':', array_keys($a));
    if(preg_match(make_regexp('a:b:lst'), $keys, $matches)) {
        return array_merge(slice($a, $matches['b']), f(slice($a, $matches['lst'])));
    }

    if(preg_match(make_regexp('a:b'), $keys, $matches)) {
        return [$a[$matches['b']]];
    }

    return [];
}

echo implode(' ', f(['Хорошо','живёт','на свете','Винни-пух']));
