2015-11-14 2 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; 
    }); 
} 

но снова возвращаются мне ошибку -

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

Используйте imodifier, если вы хотите, чтобы соответствовать без учета регистра и добавить word boundaries при необходимости.

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

} 

Это может быть улучшен, чтобы посмотреть в каждое значение и проверить, если это тоже массив, а затем рекурсия в - если то, что вы думаете, может быть полезным в будущем, но вам нужно будет чтобы лучше понять, как вы собираете совпадения

Смежные вопросы