从二维数组中删除具有在平面黑名单数组中找到的列值的行

问题描述 投票:0回答:4

我有一个需要过滤的数组。我想用一组列入黑名单的单词进行过滤,以获得一个没有那些被禁止的“单词”的新数组。

[
    ['occurence' => 17, 'word' => 'sampleword'],
    ['occurence' => 14, 'word' => 'sampleword1'],
    ['occurence' => 14, 'word' => 'sampleword2'],
    ['occurence' => 14, 'word' => 'sampleword3'],
]

我有一个功能很好用,但它只过滤一个“词”。

function words_not_included( $w ) {
   $not_included      = 'sampleword1';
   return $w['word'] != $not_included;
}

然后我申请了

$new_array = array_filter($old_array, "words_not_included");

所以它适用于一个词。

我怎样才能拥有一系列禁止的“单词”,例如:

$forbidden_words = ['sampleword1', 'sampleword3']; 

然后用它们过滤并输出一个像这样的新数组:

[
    ['occurence' => 17, 'word' => 'sampleword'],
    ['occurence' => 14, 'word' => 'sampleword2'],
]
php arrays multidimensional-array filtering blacklist
4个回答
1
投票

使用现有代码

in_array

function words_not_included( $w ) {
   $not_included = array('sampleword1', 'sampleword3');
   return !in_array($w['word'], $not_included);
}

0
投票

如果我没理解错的话,你有 2 个数组,你希望第一个数组不包含第二个数组中的任何单词。

例如,如果您将 ['ball', 'pie', 'cat', 'dog', 'pineapple'] 作为第一个数组,将 ['ball', 'cat'] 作为第二个数组,您需要输出为 ['pie', 'dog', 'pineapple']

in_array() 允许你传入一个数组,这样你就可以将多个值放在一起比较。根据您当前的代码,您可以执行以下操作:

function words_not_included( $allWords, $ignoreWords ) {
   return !in_array( $ignoreWords, $allWords);
}


0
投票

这样试试

function words_not_included($inputArray, $forbiddenWordsArray){

$returnArray = array();

//loop through the input array

for ($i = 0; $i < count($inputArray);$i++){

    foreach($inputArray[$i] as $key => $value){
        $allowWordsArray = array();
        $isAllow = false;

        //only the word element
        if($key == "word"){

            //separate the words that will be allow
            if(!in_array($value,$forbiddenWordsArray)){
                $isAllow = true;
            }
        }

        if ($isAllow === true){
            $returnArray[] = $inputArray[$i];
        }

    }
}

return $returnArray;
}


$inputArray = array();
$inputArray[] = array("occurence" => 17, "word" => "sampleword");
$inputArray[] = array("occurence" => 17, "word" => "sampleword1");
$forbiddenWords = array("sampleword");

var_dump(words_not_included($inputArray, $forbiddenWords));

0
投票

this answer的过滤从交集反转为差异。

代码:(演示

var_export(
    array_udiff(
        $array,
        $forbidden_words,
        fn($a, $b) =>
            ($a['word'] ?? $a)
            <=>
            ($b['word'] ?? $b)
    )
);

因为

$a
$b
可能来自任一数组,请尝试访问“word”列中的值。如果没有“word”元素,则变量包含平面数组中的数据,无需指定键即可访问。

© www.soinside.com 2019 - 2024. All rights reserved.