php数组多维搜索坏词

时间:2015-05-06 09:32:50

标签: php arrays sorting

我试图在数组中搜索坏词。 我的数组看起来像:

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数组,如:$ bad = array(“fuck”,“....);

现在我有点困惑,什么是扫描第一个数组的所有值的最快方法,如果它包含坏词,则返回true或false?

任何建议都会有所帮助; - )

谢谢!

//编辑:

谢谢@大家...... 我会用:

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;
    }
}

我已经对它进行了测试,它将是解决我问题的最快解决方案; - ))

谢谢大家

3 个答案:

答案 0 :(得分: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;  
}

使用正则表达式应该更快,但这只是一个例子,让你知道它是如何工作的。

答案 1 :(得分: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;
    }

}

答案 2 :(得分: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'

希望这会有所帮助:)