preg_match()期望参数2是字符串,给定数组

时间:2015-11-14 01:08:06

标签: php arrays regex

数组搜索返回错误。

假设我有一个像这样的数组---

[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为字符串,给定数组

我做错了什么,知道如何解决这个问题!!

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

}

这可以改进,以查看每个值,并检查它是否也是一个数组,然后递归 - 如果那些你认为可能在将来有用的东西,但你需要工作你如何以更好的方式收集比赛