2015-05-06 3 views
0

im пытается найти в массиве для badwords. мой массив выглядит следующим образом:php array многомерный поиск для плохих слов

Array 
(
    [base] => 2312783821823912 
    [charset] => utf-8 
    [Product] => Samsung PD291 Printer 
    [meta] => Array 
     (
      [description] => fucking nice Printer 
      [keywords] => 
     ) 

    [n2] => Array 
     (
      [w1] => Array 
       (
        [0] => printer 
       ) 

      [w2] => Array 
       (
        [0] => Menu 
        [1] => Main menu 
        [2] => Social 
        [3] => Speakers 
        [4] => 2015 
        [5] => Highlight 
        [6] => And... Action! 
        [7] => Short 
        [8] => Platin 
        [9] => Gold 
        [10] => Silber 
        [11] => Bronze 
        [12] => partner 
       ) 

     ) 
} 

У меня есть BADWORD массив как: $ плохой = массив («трахаться»,»....);

Теперь я немного смущен, что было бы самым быстрым способ сканировать все значения первого массива и возвращает истину или ложь, если она содержит матные?

Какой совет поможет ;-)

Спасибо!

// еди т:

Спасибо @ всем ... я буду использовать:

class BadWordFilter { 

    private static $bad = "/fuck|ass/i"; 

    public static function hasBadWords($input) { 
     foreach ($input as $element) { 
      if (is_array($element)) { 
       if (self::hasBadWords($element)) { 
        return true; 
       } 
      } else { 
       if (preg_match(self::$bad, $element)) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
} 

Я испытал это, и это будет самым быстрым решения моей проблемы ;-))

Спасибо всем

+1

1. Вы пробовали что-нибудь? 2. * сканировать все значения первого массива * <- Вы хотите сказать, что хотите только сканировать первое измерение массива? – Rizier123

+0

Использовать foreach loop и in_array функцию PHP –

+0

oh, извините, я забыл :) – jimbo

ответ

0

Вы можете сделать это с помощью рекурсивного поиска, который заканчивает свою задачу, когда будет найдено плохое слово. Обратите внимание, что преобразование его в json является субоптимальным, поскольку вы преобразовываете его в строку, а затем пытаетесь найти плохие слова в строке. Это занимает много времени, особенно если у вас много массивов для проверки плохих слов.

public class BadWordFilter { 

    private static $bad = array(); //use your array instead 

    public static function hasBadWords($input) { 
     foreach ($element in $input) { 
      if (is_array($element)) { 
       if (self::hasBadWords($element)) { 
        return true; 
       } 
      } else { 
       foreach ($bad as $badWord) { 
        if(strpos($element, $badWord) !== false) { 
         return true; 
        } 
       } 
      } 
     } 
     return false; 
    } 

} 
+1

Опечатка: '$ in_array' – steven

+0

Большое спасибо, @steven, вы совершенно правы. Я отредактировал свое сообщение соответственно. –

2

Я думаю, что самый быстрый путь к json_encode массива и сканировать строку JSON для плохих слов.

Не тестировался, но что-то, как это должно работать:

function badWordsExists($input_array, $blacklist){ 
    $jsonstring = json_encode($input_array); 
    foreach($blacklist as $string) { 
     if(strpos($jsonstring, $string) !== false) { 
      return true; 
     } 
    } 
    return false; 
} 

Использование регулярных выражений должно быть быстрее, но это всего лишь пример, чтобы дать вам представление, как это может работать.

+0

Как я описал, я считаю, что это неоптимальное решение. Кроме того, я считаю, что вы слишком усложняете задачу, когда приходится проходить массив плохих слов каждый раз, когда вы проверяете это. На мой взгляд, набор плохих слов не будет часто меняться. –

+0

@LajosArpad для передачи черного списка в виде массива или его статического var вместо этого может быть реализована OP. Но я не думаю, что это большой прирост производительности. Разница в производительности при преобразовании его в json_string против хождения, повторяющегося через n-мерный массив, очень велика, как я думаю. – steven

+0

Обратите внимание, что вы преобразовываете весь массив в строку, независимо от того, содержит ли он уродливые слова или нет. Мое решение завершает поиск, пока найдено первое уродливое слово. Кроме того, ваш код преобразует его в строку, даже если на входе нет субмассивов. После сравнения вы ищете уродливые слова один за другим, что заставляет алгоритм останавливаться, когда есть первое совпадение в плохих словах. –

0

Рекурсивная функция - ответ здесь. В приведенном ниже коде будет обнаружена любая строка в любом элементе данного массива.

<?php 

function containsWord($haystack, $badWord) 
{ 
    foreach ($haystack as $index => $item) { 
     if (is_array($item)) { 
      containsWord($item, $badWord); 
     } else { 
      if (strpos($item, $badWord) !== false) { 
       echo "'$badWord' has been detected in '$item' at index '$index'"; 
       return true; 
      } 
     } 
    } 

    echo "$badWord is not in the array"; 
    return false; 
} 

$array = [1 => [4=> 'badword', 5=> 'qw'], 2 => 'b', 3 => 'c']; 

containsWord($array, 'bad'); 

Выход выше кода будет: 'bad' has been detected in 'badword' at index '4'

Надеется, что это помогает :)

Смежные вопросы