PHP:根据数组B过滤数组A

PHP: filter array A according to array B

我进行了 Ajax 调用,以便从这样的数组中过滤值:

<?php

    $dataset = array_filter($_REQUEST['dataset'], function ($v){
        return filterArray($_REQUEST['keyword'], $v);
    });

    function filterArray($needle,$haystack){
        $needle = strtolower($needle);
        foreach($haystack as $v){
            if (stripos($v, $needle) !== false){
                return true;
            }
        };
    }
    echo json_encode($dataset, JSON_UNESCAPED_UNICODE);

?>

感谢周围人的帮助,现在效果很好。

但是,我需要一些更复杂的东西:

我通过 AJAX 将两个几乎相同的数组导入到 php 文件中。我们称它们为 "cleanDataset" 和 "rawDataset".

它们基本上是克隆,但 "rawDataset" 是原件,而 "cleanDataset" 是副本,没有任何 html 标签和我不想加入的不需要的字符搜索。差异虽小但数量众多且不可预测。

所以,我想针对选定的关键字搜索 "cleanDataset",但我希望 "rawDataset" 被相应地过滤,并返回到 javascript 文件。

不幸的是,在上面的代码中,搜索的数组也是要过滤的数组。

所以基本上,这是我尝试过的方法,但没有用:

<?php

    $rawDataset = array_filter($_REQUEST['rawDataset'], function ($v){
        return filterArray($_REQUEST['keyword'], $_REQUEST['cleanDataset']);
    });

    function filterArray($needle,$haystack){
        $needle = strtolower($needle);
        foreach($haystack as $v){
            if (stripos($v, $needle) !== false){
                return true;
            }
        };
    }
    echo json_encode($rawDataset, JSON_UNESCAPED_UNICODE);

?>

我在尝试使用 console.log() 显示输出数组时收到 "jSon Parse error: unrecognized token '<'" 消息。 除此之外,在我看来,我 运行 基于我所掌握的知识很少,很快就没有了选择。在我能想到的脚本中没有其他地方可以将过滤从 cleaDataset 重定向到 rawDataset。我在网上搜索过类似的案例,但没有找到。

如有任何帮助,我们将不胜感激。谢谢。

这是我的建议。您可以通过 use 关键字将 "external" 变量传递给回调函数。

此外 array_filter() 可以使用 ARRAY_FILTER_USE_BOTH 标志

传递元素键和值

这里我稍微简化了代码以使其更具可读性,但本质上它应该可以工作并且仍然展示了我的想法

$keyword = 'abc';
$cleanDataset = ['abcd', 'zabcd', 'awbcd', 'as abc d abc'];
$rawDataset = ['abcd<br>', '<p>zabcd', '<strong>awbcd', 'as <code>abc</code> d abc'];

$rawDataset = array_filter($rawDataset, function ($v, $k) use ($keyword, $cleanDataset) {
    return findWord($keyword, $cleanDataset[$k]);
}, ARRAY_FILTER_USE_BOTH);

function findWord($needle,$haystack){
    $needle = strtolower($needle);
    return (boolean) (stripos($haystack, $needle) !== false);
}