【问题标题】:PHP: filter array A according to array BPHP:根据数组B过滤数组A
【发布时间】:2020-07-17 13:04:12
【问题描述】:

我进行了一个 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 '

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: php output comparison array-filter


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。我仍然收到一条错误消息,但我认为问题在于我的“干净”数组与我的原始数组不完全匹配,原因是我不明白。但是为了解决这个问题而创建了 2 个数组,它工作得很好。再次感谢 Banzay!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多