protected function generateSortedKeysMap(): array
    {
        $sortedKeysMap = [];

        $startKeys = $this->startKeys;
        $middleKeys = $this->middleKeys;
        $endKeys = $this->endKeys;
        $beforeKeys = $this->beforeKeys;
        $afterKeys = $this->afterKeys;
        $flattenFunction = function ($value, $key, $step) use (&$sortedKeysMap, &$beforeKeys, &$afterKeys, &$flattenFunction) {
            if (isset($beforeKeys[$value])) {
                array_walk_recursive($beforeKeys[$value], $flattenFunction, $step);
                unset($beforeKeys[$value]);
            }
            $sortedKeysMap[$step][] = $value;
            if (isset($afterKeys[$value])) {
                array_walk_recursive($afterKeys[$value], $flattenFunction, $step);
                unset($afterKeys[$value]);
            }
        };

        // 1st step: collect regular keys and process before / after if keys occurred
        array_walk_recursive($startKeys, $flattenFunction, 0);
        array_walk_recursive($middleKeys, $flattenFunction, 2);
        array_walk_recursive($endKeys, $flattenFunction, 4);

        // 2nd step: process before / after leftovers for unmatched keys
        array_walk_recursive($beforeKeys, $flattenFunction, 1);
        array_walk_recursive($afterKeys, $flattenFunction, 3);

        ksort($sortedKeysMap);
        return $sortedKeysMap;
    }
protected function generateSortedKeysMap(): array
    {
        $sortedKeysMap = [];

        $startKeys = $this->startKeys;
        $middleKeys = $this->middleKeys;
        $endKeys = $this->endKeys;
        $beforeKeys = $this->beforeKeys;
        $afterKeys = $this->afterKeys;
        $flattenFunction = function ($value, $key, $step) use (&$sortedKeysMap, &$beforeKeys, &$afterKeys, &$flattenFunction) {
            if (isset($beforeKeys[$value])) {
                array_walk_recursive($beforeKeys[$value], $flattenFunction, $step);
                unset($beforeKeys[$value]);
            }
            $sortedKeysMap[$step][] = $value;
            if (isset($afterKeys[$value])) {
                array_walk_recursive($afterKeys[$value], $flattenFunction, $step);
                unset($afterKeys[$value]);
            }
        };

        // 1st step: collect regular keys and process before / after if keys occurred
        array_walk_recursive($startKeys, $flattenFunction, 0);
        array_walk_recursive($middleKeys, $flattenFunction, 2);
        array_walk_recursive($endKeys, $flattenFunction, 4);

        // 2nd step: process before / after leftovers for unmatched keys
        array_walk_recursive($beforeKeys, $flattenFunction, 1);
        array_walk_recursive($afterKeys, $flattenFunction, 3);

        ksort($sortedKeysMap);
        return $sortedKeysMap;
    }
protected function generateSortedKeysMap ( ) : array { $ sortedKeysMap = [ ] ; $ startKeys = $ this -> startKeys ; $ middleKeys = $ this -> middleKeys ; $ endKeys = $ this -> endKeys ; $ beforeKeys = $ this -> beforeKeys ; $ afterKeys = $ this -> afterKeys ; $ flattenFunction = function ( $ value , $ key , $ step ) use ( & $ sortedKeysMap , & $ beforeKeys , & $ afterKeys , & $ flattenFunction ) { if ( isset ( $ beforeKeys [ $ value ] ) ) { array_walk_recursive ( $ beforeKeys [ $ value ] , $ flattenFunction , $ step ) ; unset ( $ beforeKeys [ $ value ] ) ; } $ sortedKeysMap [ $ step ] [ ] = $ value ; if ( isset ( $ afterKeys [ $ value ] ) ) { array_walk_recursive ( $ afterKeys [ $ value ] , $ flattenFunction , $ step ) ; unset ( $ afterKeys [ $ value ] ) ; } } ; // 1st step: collect regular keys and process before / after if keys occurred array_walk_recursive ( $ startKeys , $ flattenFunction , 0 ) ; array_walk_recursive ( $ middleKeys , $ flattenFunction , 2 ) ; array_walk_recursive ( $ endKeys , $ flattenFunction , 4 ) ; // 2nd step: process before / after leftovers for unmatched keys array_walk_recursive ( $ beforeKeys , $ flattenFunction , 1 ) ; array_walk_recursive ( $ afterKeys , $ flattenFunction , 3 ) ; ksort ( $ sortedKeysMap ) ; return $ sortedKeysMap ; }
Flattens start-, middle-, end-, before- and afterKeys to a single dimension and merges them together to a single array

@return array
Flattens start - middle - end - before - and afterKeys to a single dimension and merges them together to a single array