Tetris-ing an array

后端 未结 16 1661
时光取名叫无心
时光取名叫无心 2021-01-30 15:38

Consider the following array:

/www/htdocs/1/sites/lib/abcdedd
/www/htdocs/1/sites/conf/xyz
/www/htdocs/1/sites/conf/abc/         


        
16条回答
  •  渐次进展
    2021-01-30 16:18

    $values = array('/www/htdocs/1/sites/lib/abcdedd',
                    '/www/htdocs/1/sites/conf/xyz',
                    '/www/htdocs/1/sites/conf/abc/def',
                    '/www/htdocs/1/sites/htdocs/xyz',
                    '/www/htdocs/1/sites/lib2/abcdedd'
    );
    
    
    function splitArrayValues($r) {
        return explode('/',$r);
    }
    
    function stripCommon($values) {
        $testValues = array_map('splitArrayValues',$values);
    
        $i = 0;
        foreach($testValues[0] as $key => $value) {
            foreach($testValues as $arraySetValues) {
                if ($arraySetValues[$key] != $value) break 2;
            }
            $i++;
        }
    
        $returnArray = array();
        foreach($testValues as $value) {
            $returnArray[] = implode('/',array_slice($value,$i));
        }
    
        return $returnArray;
    }
    
    
    $newValues = stripCommon($values);
    
    echo '
    ';
    var_dump($newValues);
    echo '
    ';

    EDIT Variant of my original method using an array_walk to rebuild the array

    $values = array('/www/htdocs/1/sites/lib/abcdedd',
                    '/www/htdocs/1/sites/conf/xyz',
                    '/www/htdocs/1/sites/conf/abc/def',
                    '/www/htdocs/1/sites/htdocs/xyz',
                    '/www/htdocs/1/sites/lib2/abcdedd'
    );
    
    
    function splitArrayValues($r) {
        return explode('/',$r);
    }
    
    function rejoinArrayValues(&$r,$d,$i) {
        $r = implode('/',array_slice($r,$i));
    }
    
    function stripCommon($values) {
        $testValues = array_map('splitArrayValues',$values);
    
        $i = 0;
        foreach($testValues[0] as $key => $value) {
            foreach($testValues as $arraySetValues) {
                if ($arraySetValues[$key] != $value) break 2;
            }
            $i++;
        }
    
        array_walk($testValues, 'rejoinArrayValues', $i);
    
        return $testValues;
    }
    
    
    $newValues = stripCommon($values);
    
    echo '
    ';
    var_dump($newValues);
    echo '
    ';

    EDIT

    The most efficient and elegant answer is likely to involve taking functions and methods from each of the provided answers

提交回复
热议问题