0

アイテムが配列に存在しなくなったが、不要になった名前のフォルダーがある場合。フォルダを確認して削除する最良の方法は何ですか?

例:

次に、コマンドを実行してarray('blah','apple','oneDirection'); 、配列内の名前で特定の場所にフォルダー/ディレクトリを作成しますが、配列oneDirectionにない場合は、フォルダー/ディレクトリを削除したい->使用しin_arrayますか?

配列データは外部 JSON フィードから取得されるため、自動的に削除されます。これが完了したら、フォルダー/ディレクトリを削除したいと思います-配列とフォルダー/ディレクトリ名のチェック構造につ​​いてはわかりません

4

4 に答える 4

1

例として役立つかもしれない簡単なスニペット。

function del_dir($dir, $key, $root) {
        // may need to do more here like delete recursively
        $rp= realpath($root .'\\'. $dir);
        rmdir( $rp);
        echo "folder: $rp : removed\n";
}

// your root folder
$home_dir= "c:\\tmp";
// your array of folders
$folders= array("folder1", "folder2");
$fs_folders=array();
if ($dh = opendir($home_dir)) {
    while (($f = readdir($dh)) !== false) {
        if(is_dir("$home_dir\\$f")){
            if ($f != "." && $f != "..")
                $fs_folders[]= $f;
        }
    }
    closedir($dh);
}

$todel= array_diff($fs_folders, $folders);
array_walk($todel, "del_dir", $home_dir);
于 2012-11-30T08:21:33.677 に答える
0

あなたがしなければならないことは、現在持っているすべてのフォルダーをループし、すべての名前/ID を配列に保存することです。この配列を$createdFolders.

次に、JSON フィードをループし、まだ作成されていないすべてのフォルダーを作成し、既に存在する場合unsetは の id/name から作成します。$createdFolders

すべての項目をループしたら、ループできるようになります$createdFolders。ここに残された項目が削除候補です。

実際のチェックに関してはin_array、次のようなもので十分です。

if ( in_array ( $array[$item], $createdFolders )) {
    unset ( $createdFolders[$item] );
}

もちろん、これはキーが両方の配列で同じであることを前提としています。

于 2012-11-30T07:40:22.813 に答える
0
  1. 配列からアイテムを削除すると、フォルダーも削除されます。それが不可能なら
  2. 2 つの配列を保持する: 1 つの配列では、アイテムが削除され、次に配列の相違点を比較します = 削除するフォルダー、または
  3. すべてのフォルダーが 1 つのフォルダーにあり、他のコンテンツがない場合は、親フォルダーのすべての子を読み込み、それらが配列にあるかどうかを確認します

別のフォルダーのすべてのフォルダーを取得する方法は次のとおりです。フォルダーのみを一覧表示する PHP opendir()

次に、ifステートメントでin_arrayメソッドまたはその他の方法を使用して、フォルダーが配列内にあるかどうかを判断します。そうでない場合は、削除してください。

于 2012-11-30T07:29:27.987 に答える
0

配列からフォルダーを「削除」するコード内の同じ場所であるTMHOは、実際のフォルダーを削除する必要があります。より具体的には、unsetorを使用する代わりに、( andを使用して) 最初にフォルダーarray_popを試行する関数を作成し、すべてがうまくいった場合にのみ、配列からアイテムを削除する必要があります。rmdirtrycatch

さらに、その時点でフォルダーを削除できない場合は、アイテムを削除する必要はありませんが、再試行などで、ある種の保留中のキューに「保留」しておく必要があります。

于 2012-11-30T07:26:23.537 に答える