数组搜索返回错误。
假设我有一个像这样的数组---
[1] => Array
(
[id] => 11
[category] => phone cases
[country] => sweden
[sale_price] => 90,99
[price] => 120
[currency] => sek
[vat] => 19
[product_name] => "iphone 6 plus" case transparent
[description] => transparent case for iphone 6 plus
)
[2] => Array
(
[id] => 13
[category] => shoes
[country] => sweden
[sale_price] => 180,99
[price] => 200
[currency] => sek
[vat] => 19
[product_name] => blue platform shoes
现在我正在尝试从这个数组中搜索一些东西,基本上我想从$ all_data, ['product_name'] 字段中找到它
$data = 'plus'; // what i want to search
$search = $this->my_array_search($all_data, $data);
function my_array_search($array, $string) {
$pattern = preg_replace('/\s+/', ' ', preg_quote($string));
return array_filter($array, function ($value) use($pattern) {
return preg_match('/' . $pattern . '/', $value) == 1;
});
}
但它一直给我一个错误 -
preg_match()期望参数2为字符串,给定数组
我做错了什么,知道如何解决这个问题!!
答案 0 :(得分:2)
这是因为您正在过滤two dimensional array,一个包含数组的数组。
用于搜索数组的正确的正则表达式函数将是preg_grep()。它返回一组匹配
(不要忘记用preg_quote
)
$data = 'plus'; // what i want to search
$search = my_array_search($all_data, $data);
function my_array_search($array, $string)
{
$ret = false;
$pattern = preg_replace('/\s+/', ' ', preg_quote($string, '/'));
foreach($array AS $k => $v) {
$res = preg_grep('/' . $pattern . '/', $v);
if(!empty($res)) $ret[$k] = $res;
}
return $ret;
}
See demo at eval.in。结果数组包含:key
=> array(matches)
array(1) {
[1]=>
array(2) {
["product_name"]=>
string(32) ""iphone 6 plus" case transparent"
["description"]=>
string(34) "transparent case for iphone 6 plus"
}
}
如果PHP版本> = 5.5,则仅搜索特定列,尝试使用array_column。
print_r(preg_grep('/plus/', array_column($all_data, 'product_name')));
如果您想匹配不区分大小写,请使用i
modifier,如果需要,请添加word boundaries。
答案 1 :(得分:1)
像这样的东西会这样做 - 正如有人指出的那样,你有一个嵌套的数组,一层深。
$data = 'plus'; // what i want to search
$search = $this->my_array_search($all_data, $data);
function my_array_search($array, $string) {
for ($i=0; $i< count($array); $i++)
{
$pattern = preg_replace('/\s+/', ' ', preg_quote($string));
return array_filter($array[$i], function ($value) use($pattern) {
return preg_match('/' . $pattern . '/', $value) == 1;
});
}
}
这可以改进,以查看每个值,并检查它是否也是一个数组,然后递归 - 如果那些你认为可能在将来有用的东西,但你需要工作你如何以更好的方式收集比赛