2015-11-14 51 views
2

數組搜索返回錯誤。preg_match()期望參數2是字符串,數組給出

假設我有一個數組,像這樣---

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

但它的回頭率我一個錯誤 -

p reg_match()期望參數2是字符串,數組給定

我做錯了什麼,做任何人都知道如何解決這個問題!

+0

頂級數組的項目是數組,而不是字符串。 –

+0

@MaratTanalin比我應該如何從數組中搜索 –

+0

'$ value'是一個數組,'$ value ['product_name']'是你感興趣的數組中的字符串。 – Sammitch

回答

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

,如果你想匹配不區分大小寫的,如果需要添加word boundaries使用imodifier

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

} 

這可以改進尋找到每個值,並檢查它也是一個數組,然後遞歸到 - 如果那是你在想可能在未來有用的,但你需要找出更好的方法來收集匹配

相關問題