Php verimli bir kara filtresi işlevi kodu nasıl?

1 Cevap php

Yani, bunun gibi üç diziler var:

 [items] => Array
            ( [0] => Array
                  ( 
                    [id] => someid
                    [title] => sometitle
                    [author] => someauthor
                    ...
                  )
              ...
             )

ve ayrıca kara virgülle ayrılmış kelime ile bir dize:

  $blacklist = "some,words,to,blacklist";

Şimdi ben (onlar biri olabilir gibi) ile bu kelimeleri maç gerekir id, title, author ve buna göre sonuçları göster.

Böyle bir fonksiyonun düşünüyordum:

  $pattern = '('.strtr($blacklist, ",", "|").')'; // should return (some|words|etc)

  foreach ($items as $item) {
          if ( !preg_match($pattern,$item['id']) || !preg_match($pattern,$item['title']) || !preg_match($pattern,$item['author']) ) 
               { 
                   // show item
               }
  }

Bu diziler filtrelemek için ya da ben FILTER_VALIDATE_REGEXP ile strpos() veya filter_var ile bir şey kullanmak gerekir en etkili yoludur ve eğer ben merak ediyorum ...

Bu fonksiyon 3 diziler başına yinelenen unutmayın. Bununla birlikte, her bir dizi 50'den fazla ürün içermez.

1 Cevap

Sevgiler kötü değil. Ben genellikle strpos Böyle bir şey için kullanmak istiyorum ...



$items = filter($foo['items'], array('some','words','to','blacklist'));

function filter($items, $blacklist) {

    $filtered = array();

    foreach($items as $item) {
        foreach($item as $key => $value) {
            $pass = true;
            foreach($blacklist as $filter) {
                $pass = strpos($value, $filter) === false;
                if(!$pass) break;
            }
            if($pass) $filtered[] = clone($item); 
        }
    }

    return $filtered;
}

Biraz daha sofistike eklemek için, size boşluk tarafından kontrol ediyoruz dizeleri tokenize edebilirsiniz. Daha sonra kod olacak:


function filter($items, $blacklist) {

    $filtered = array();

    foreach($items as $item) {
        foreach($item as $key => $value) {
            $pass = true;
            foreach(explode(' ', $value) as $word) {
                $pass = !in_array($word, $blacklist);
                if(!$pass) break;
            }
            if($pass) $filtered[] = clone($item); 
        }
    }

    return $filtered;
}