在PHP多维数组中搜索部分值匹配

时间:2014-05-05 15:43:38

标签: php search multidimensional-array

我有这个多维数组。我需要搜索它并仅返回匹配和部分匹配的值。结果数组应与原始数组维或结构相同。 我需要一个像:

这样的函数
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万条记录(可能会增加),这个数组对我的网站来说是全局的(就像数据库一样)。

2 个答案:

答案 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);

Demo

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

RecursiveArrayIteratorRecursiveIteratorIteratorRegexIterator是标准的PHP SPL类型,SubIteratorIteratorIterator-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
                )

        )

)