Эта проблема связана с следующей проблемой: поиск многомерного массива в PHP и возвращаемые ключи
У меня есть следующий массив, я хотел бы искать строки, используя, например, регулярные выражения :
[390] => Array ( [0] => hammer [1] => Properties [2] => tools, hammer, properties [3] => [4] => done [png] => Array ( [0] => hammer_16x.png [1] => hammer_32x.png ) [eps] => Array ( [0] => hammer_16x.eps [1] => hammer_32x.eps ) [ico] => Array ( [0] => hammer.ico ) )
Я хотел бы особенно искать эти значения:
[0] => hammer [1] => Properties [2] => tools, hammer, properties [3] => [4] => done
например, пользователь может найти этот ключ массива при поиске «ветчины», «инструментов», «амм» и т. д.
Я попытался адаптировать решение, размещенное в вышеприведенном сообщении, но не справился с этим. Я также нашел решение с помощью array_map, но это не позволило мне явно искать в определенном атрибуте (например, я хотел бы дополнительно ограничить поиск первым индексом в массиве, здесь [0] => hammer) :
$result= array_map('unserialize', preg_filter('/'.$searchterm.'/', '$0', array_map('serialize', $array)));
Ваши идеи приветствуются 🙂 Спасибо!
Попробуйте следующее решение. Он не использует регулярные выражения, вместо этого использует простой поиск строк. Однако это позволяет вам немного гибкости.
function filter($array, $filter_elem) { return array_filter($array, function ($v) use($filter_elem) { return count(array_udiff_assoc($filter_elem, $v, function ($a, $b) { if (!is_string($a) || !is_string($b)) return $a == $b? 0 : 1; return stripos($b, $a) !== false || stripos($a, $b) !== false? 0 : 1; })) == 0; }); } $array = array( '390' => array( '0' => 'hammer', '1' => 'Properties', '2' => 'tools, hammer, properties', '3' => false, '4' => 'done', 'png' => array( '0' => 'hammer_16x.png', '1' => 'hammer_32x.png', ), 'eps' => array( '0' => 'hammer_16x.eps', '1' => 'hammer_32x.eps', ), 'ico' => array( '0' => 'hammer.ico', ), ), ); $filter_elem = array( '1' => 'prop', '2' => 'hammer', '3' => false, '4' => 'done', ); print_r(filter($array, $filter_elem));
Вы можете использовать эту рекурсивную функцию preg_grep :
function preg_grep_recursive( $pattern, $input, $flags = 0, &$output = array() ) { foreach($input as $key => $val) { if(is_array($val)) { preg_grep_recursive($pattern, $val, $flags, $output); } else { $output[] = $val; } } return preg_grep($pattern, $output, $flags); }