我有这个多维数组。我需要搜索它并仅返回匹配和部分匹配的值。结果数组应与原始数组维或结构相同。 我需要一个像:
这样的函数function search_array($array,'kumar') { ....... }
我的数组是
$array = array(
0 => array(
2 => 'ram kumar',
1 => 'alagu jubi',
0 => 'kumar',
),
1 => array(
3 => 'senthil pandian',
2 => 'jubi alagu',
1 => 'manikandan',
0 => array(
2 => 'jancy',
1 => 'guru',
0 => 'rajesh kumar'
)
),
2 => array(
2 => 'pandi',
1 => 'selva',
0 => 'ajith'
)
);
预期结果:
array
(
[0] => array
(
[2] => ram kumar
[0] => kumar
)
[1] => array
(
[0] => array
(
[0] => rajesh kumar
)
)
)
我试试这个
function search_array($array, $val){
$ArrIterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach($ArrIterator as $id => $sub){
$childArray = $ArrIterator->getSubIterator();
if(strstr(strtolower($sub), strtolower($val))){
$childArray = iterator_to_array($childArray);
$result[] = $childArray;
}
}
return $result;
}
$resultsMul = search_array($array, 'kumar');
它的回报就像这样。
Array
(
[0] => Array
(
[2] => ram kumar
[1] => alagu jubi
[0] => kumar
)
[1] => Array
(
[2] => jancy
[1] => guru
[0] => rajesh kumar
)
)
但我只需要匹配和部分匹配的值与原始数组维度。
处理此问题的有效/最佳方法是什么?我的阵列有近20万条记录(可能会增加),这个数组对我的网站来说是全局的(就像数据库一样)。
答案 0 :(得分:0)
我不确定如何使用Iterator来解决这个问题,但你可以创建一个简单的递归函数来实现这个目的:
function search_array(&$array, $val)
{
foreach ($array as $key => &$value) {
if (is_array($value)) {
search_array($value, $val);
} elseif (stripos($value, $val) === FALSE) {
unset($array[$key]);
}
}
}
用法:
search_array($array, 'kumar');
$result = array_filter($array);
答案 1 :(得分:0)
您可以递归遍历数组线性化,然后根据正则表达式(或您选择的过滤器)过滤叶子,并为匹配获取构建结果数组的键:
$rai = new RecursiveArrayIterator($array);
$rii = new RecursiveIteratorIterator($rai);
$sii = new SubIteratorIterator($rii, SubIteratorIterator::USE_KEY);
$ri = new RegexIterator($rii, '~kumar~i');
$result = NULL;
foreach ($ri as $value) {
$p = & $result;
foreach ($sii as $key) {
$p = & $p[$key];
}
$p = $value;
unset($p);
}
RecursiveArrayIterator
,RecursiveIteratorIterator
和RegexIterator
是标准的PHP SPL类型,SubIteratorIterator
是Iterator-Garden的一部分,它是公共的封装变体在Get array's key recursively and create underscore seperated string。
这些键对结果数组的访问(这里设置)(比较例如:use strings to access (potentially large) multidimensional arrays但有更好的例子)只是直接进行一些引用。
根据您的输入,结果是:
Array
(
[0] => Array
(
[2] => ram kumar
[0] => kumar
)
[1] => Array
(
[0] => Array
(
[0] => rajesh kumar
)
)
)