phparraysfilterarray-differenceblacklist

Filter a flat array by a flat blacklist array


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 don't want to show?

<?php
$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/>";
    }
}

Solution

  • 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.