4

私は単純であるべきタスクを持っています、

  • パスを指定して、すべての子 (深さ 1 レベル) のlessフォルダーを検索します。
  • フォルダーが見つかった場合は、フル パスをキーとして配列に追加します。
  • キーの値を同じパスに設定しますが、次のパスに置き換えlessますcss
  • less ディレクトリ内で、すべての子ディレクトリを再帰的にループします
  • 元のディレクトリと同じ方法でサブディレクトリを追加します

したがって、この構造を考えると

注: randomfileを除く以下のすべての項目はディレクトリです

matthew@vaio:/var/www/constructor/public/bundles$ tree
.
├── first
│   └── less
│       ├── secondtester
│       └── tester
│           ├── anothersubtester
│           ├── randomfile
│           └── subtester
├── second
│   └── less
│       ├── secondtester
│       └── tester
│           ├── anothersubtester
│           ├── randomfile
│           └── subtester
└── third
    └── noless
        ├── secondtester
        └── tester
            ├── anothersubtester
            ├── randomfile
            └── subtester

18 directories, 3 files

この配列で終わりたいです(読みやすくするために、ここでパスを切り捨てていることに注意してください)

Array
    (
    [/b/second/less] => /b/second/css
    [/b/second/less/secondtester] => /b/second/css/secondtester
    [/b/second/less/tester] => /b/second/css/tester
    [/b/second/less/tester/subtester] => /b/second/css/tester/subtester
    [/b/second/less/tester/anothersubtester] => /b/second/css/tester/anothersubtester
    [/b/first/less] => /b/first/css
    [/b/first/less/secondtester] => /b/first/css/secondtester
    [/b/first/less/tester] => /b/first/css/tester
    [/b/first/less/tester/subtester] => /b/first/css/tester/subtester
    [/b/first/less/tester/anothersubtester] => /b/first/css/tester/anothersubtester
)

今、私は以下のコードを持っていますが、これはまったく最適化されているとは思いません。たとえば、RecursiveIteratorIteratorsなどがあることは知っていますが、このタスクでそれらを使用する方法がわかりません。リフティングを行います。基本的に、これをより適切に最適化するためにどのように書くことができるか疑問に思っています:

$directories = array();
$bundlePath = realpath('/public/bundles');

function lessSearcher($lessPath, $cssPath){
    $directories = array($lessPath => $cssPath);

    $lessDirs = new DirectoryIterator($lessPath);
    foreach ($lessDirs as $lessDir) {
        //we only want the directories and not the .'s
        if ($lessDir->isDot() || !$lessDir->isDir()) continue;
        $lessCurrent = $lessPath . '/' . $lessDir->getFileName();
        $cssCurrent = $cssPath . '/' . $lessDir->getFileName();
        $directories[$lessCurrent] = $cssCurrent;
        $directories = array_merge($directories, lessSearcher($lessCurrent, $cssCurrent));
    }

    return $directories;
}

$bundles = new DirectoryIterator($bundlePath);
foreach ($bundles as $bundle) {
    //we only want the directories and not the .'s
    if($bundle->isDot() || !$bundle->isDir()) continue;
    //we only want the directories that have a less directory
    if(!realpath($bundlePath.'/'.$bundle->getFileName().'/less')) continue;

    $lessPath = realpath($bundlePath . '/' . $bundle->getFileName()) . '/less';
    $cssPath = realpath($bundlePath . '/' . $bundle->getFileName()) . '/css';

    $directories = array_merge($directories, lessSearcher($lessPath, $cssPath));
}
4

2 に答える 2

0

コードは正しく最適化されていると思います。
すべてのディレクトリとサブディレクトリをリストし、「less」ディレクトリを持たないものを削除し、それを持つもののために新しい配列を作成するスクリプトを作成しました。
次に、1000回のループであなたと私の両方をテストしました。あなたのスクリプトは平均0.93 秒かかり、私のスクリプトは1.27 秒かかりました。私の意見では、あなたのコードは大丈夫です。

于 2013-01-03T17:19:32.540 に答える