由于文件的每一行都位于数组的一行中,因此array_filter您可能会对函数感兴趣(引用) :
array array_filter ( array $input [, callback $callback ] )
迭代输入中的每个值
数组将它们传递给回调
功能。
如果回调
函数返回true,当前
输入的值返回到
结果数组。数组键是
保存下来。
你可以使用strpos or stripos确定一个字符串是否包含在另一个字符串中。
例如,假设我们有这个数组:
$arr = array(
'this is a test',
'glop test',
'i like php',
'a badword, glop is',
);
我们可以定义一个回调函数来过滤掉包含“的行glop
" :
function keep_no_glop($line) {
if (strpos($line, 'glop') !== false) {
return false;
}
return true;
}
并使用该功能array_filter
:
$arr_filtered = array_filter($arr, 'keep_no_glop');
var_dump($arr_filtered);
我们会得到这样的输出:
array
0 => string 'this is a test' (length=14)
2 => string 'i like php' (length=10)
即我们删除了所有包含“badword”“glop”的行。
当然,现在您已经有了基本的想法,没有什么可以阻止您使用更复杂的回调函数;-)
评论后编辑:这是应该有效的完整代码部分:
首先,您有行列表:
$arr = array(
'this is a test',
'glop test',
'i like php',
'a badword, glop is',
);
然后,从文件中加载坏词列表:
然后你修剪每一行,并删除空行,以确保你最终只得到“单词”$bad_words
数组,而不是会引起麻烦的空白内容。
$bad_words = array_filter(array_map('trim', file('your_file_with_bad_words.txt')));
var_dump($bad_words);
The $bad_words
数组包含,来自我的测试文件:
array
0 => string 'glop' (length=4)
1 => string 'test' (length=4)
然后,回调函数循环遍历该坏词数组:
注意:使用全局变量并不是那么好:-(但是调用的回调函数array_filter
没有获取任何其他参数,并且我不想每次调用回调函数时都加载文件。
function keep_no_glop($line) {
global $bad_words;
foreach ($bad_words as $bad_word) {
if (strpos($line, $bad_word) !== false) {
return false;
}
}
return true;
}
并且,和以前一样,您可以使用array_filter
过滤行:
$arr_filtered = array_filter($arr, 'keep_no_glop');
var_dump($arr_filtered);
这一次,给你:
array
2 => string 'i like php' (length=10)