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

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

我进行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解析错误:无法识别的标记'

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

编辑:这是我现在在Banzay的帮助下所拥有的东西:

<?php

    $rawdataset  =[[3,"Yellow","spanish"], [2,"Brown","<span>Toto</span>"], [1,"Green","brown"]];
    $cleandataset=[[3,"Yellow","spanish"], [2,"Brown","Toto"], [1,"Green","brown"]];

    $rawdataset = array_filter($rawdataset, function ($v,$k) use   ($keyword, $cleanDataset){

        return filterArray('sPan', $cleanDataset[$k]);

    }, ARRAY_FILTER_USE_BOTH);

    function filterArray($needle,$haystack){

        $needle = strtolower($needle);

        foreach($haystack as $k => $v){

             if (stripos($v, $needle) !== false) return true;

        };

        return in_array($needle,$haystack);
    }

    echo '<pre>'; print_r($rawdataset); echo '</pre>';

?>

这是我收到的错误消息:

Warning: Invalid argument supplied for foreach() in /home/clients/4adf068d83a323d158f798c5347d3685/phenotype/sandrine11/php/filter_data.php on line 16

Warning: in_array() expects parameter 2 to be array, null given in /home/clients/4adf068d83a323d158f798c5347d3685/phenotype/sandrine11/php/filter_data.php on line 22

Warning: Invalid argument supplied for foreach() in /home/clients/4adf068d83a323d158f798c5347d3685/phenotype/sandrine11/php/filter_data.php on line 16

Warning: in_array() expects parameter 2 to be array, null given in /home/clients/4adf068d83a323d158f798c5347d3685/phenotype/sandrine11/php/filter_data.php on line 22

Warning: Invalid argument supplied for foreach() in /home/clients/4adf068d83a323d158f798c5347d3685/phenotype/sandrine11/php/filter_data.php on line 16

Warning: in_array() expects parameter 2 to be array, null given in /home/clients/4adf068d83a323d158f798c5347d3685/phenotype/sandrine11/php/filter_data.php on line 22
Array
(
)
php output comparison array-filter
1个回答
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.