此问题与以下问题有关: Search multidimensional array in PHP and return keys
我有以下数组我想搜索字符串使用例如正则表达式:
[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
e.g。在搜索“ham”,“tools”,“amm”等时,用户可以找到这个数组键。
我尝试调整上面帖子中发布的解决方案,但没有管理它。我也找到了一个使用array_map的解决方案,但这并没有让我明确搜索一个特定的属性(例如我想进一步限制搜索到数组中的第一个索引,这里[0] =>锤子):
$result= array_map('unserialize', preg_filter('/'.$searchterm.'/', '$0', array_map('serialize', $array)));
欢迎您的想法:) 谢谢!
答案 0 :(得分:0)
尝试以下解决方案。它不使用正则表达式,而是使用纯字符串搜索。但是它可以根据需要提供一些灵活性。
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));
答案 1 :(得分:0)
您可以使用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);
}