tags:

views:

147

answers:

3

I am using PHP and I have an array of user images that I need to filter. I need to do 2 different filters:

  1. Look in original array and see if each value contains a value in my "bad words" array
  2. Look and see if the value in the original array ends in one of "bad extensions" values

Images Array:

Array  
(  
    [0] => smiles.gif  
    [1] => kittens.jpg  
    [2] => biscuits.png  
    [3] => butthead.jpg  
)  

$bad_words = array('beavis','butthead','winehouse');  
$bad_extensions = array('.gif','.tiff');

I would like it to return:

Array  
(  
    [0] => kittens.jpg  
    [1] => biscuits.png  
)
A: 

You could use the array_filter function in PHP, just write a function that does the filtering you want then call

array_filter($array1, "custom_filter");
Brian Fisher
A: 

Firstly, I'd remove the periods in your extension list. It will only make the code more difficult. If you've done this, the following (untested) code should work, or at least be a start

$cleanArray = [];

foreach($array as $value) {

    $extension = path_info($value, PATHINFO_EXTENSION);

    if (in_array($extension, $bad_extensions)) {
        continue;
    }

    foreach($bad_words as $word) {
        if (strstr($word, $value)) {
            continue 2;
        }
    }
    $cleanArray[] = $value;


}

$cleanArray should have the values you want.

Here are some handy references from the PHP online docs

alex
A: 
$array = array("smiles.gif", "kittens.jpg", "biscuits.png", "butthead.jpg");

$new_arr = array_filter($array, "filter");

function filter($element) {
    $bad_words = array('beavis','butthead','winehouse');  
    $bad_extensions = array('gif','tiff');

    list($name, $extension) = explode(".", $element);
    if(in_array($name, $bad_words))
     return;

    if(in_array($extension, $bad_extensions))
     return;

    return $element;
}


echo "<pre>";
print_r($new_arr);
echo "</pre>";

Outputs

Array
(
    [1] => kittens.jpg
    [2] => biscuits.png
)

I removed the . from your extensions tho

edit: added wicked fleas correction

lemon
Technically, you can return `$element` instead of `"{$name}.{$extension}"` as you did no manipulation of it.
The Wicked Flea
What if you have a filename.like.this.jpg ?
alex
I'm also pretty sure `in_array()` doesn't search like that. It determines if the string matches precisely.
alex
@alex in_array "Returns TRUE if needle is found in the array, FALSE otherwise". @Flea good point, ty.
lemon