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);
}
我进行了 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);
}