PHP阵列阻止列表

PHP阵列阻止列表

问题描述:

I've created this code to cycle through the folders in the current directory and echo out a link to the folder, it all works fine. How would I go about using the $blacklist array as an array to hold the directory names of directories I dont want to show?

$blacklist = array('dropdown');

$results = array();
$dir = opendir("./");

while($file = readdir($dir)) {
    if($file != "." && $file != "..") {
        $results[] = $file;
    }
}

closedir($dir);

foreach($results as $file) {
    if($blocked != true) {
        $fileUrl = $file;
        $fileExplodedName = explode("_", $file);
        $fileName = "";
        $fileNameCount = count($fileExplodedName);

        echo "<a href='".$fileUrl."'>";

        $i = 1;

        foreach($fileExplodedName as $name) {
            $fileName .= $name." ";
        }       

        echo trim($fileName);
        echo "</a><br/>";
    }
}

Use in_array for this.

$blocked = in_array($file, $blacklist);

Note that this is rather expensive. The runtime complexity of in_array is O(n) so don't make a large blacklist. This is actually faster, but with more "clumsy" code:

$blacklist = array('dropdown' => true);
/* ... */
$blocked = isset($blacklist[$file]);

The runtime complexity of the block check is then reduced to O(1) since the array (hashmap) is constant time on key lookup.

array_diff is the best tool for this job -- it's the shortest to write, very clear to read, and I would expect also the fastest.

$filesToShow = array_diff($results, $blacklist);
foreach($filesToShow as $file) {
    // display the file
}