递归搜索PHP多维数组中的部分值匹配



我有这个多维数组。我需要搜索它,只返回匹配和部分匹配的值。生成的数组应与原始数组的尺寸或结构相同。我需要一个这样的函数:

function search_array($array,'kumar') { ....... }

My Array is

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

我不太确定如何用迭代器解决这个问题,但是您可以创建一个简单的递归函数来实现:

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

您可以递归地遍历线性化的数组,然后根据regex(或您选择的过滤器)过滤叶子,并为匹配获取键以构建结果数组:

$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, RecursiveIteratorIteratorRegexIterator是标准的PHP SPL类型,SubIteratorIterator是Iterator-Garden的一部分,它是常见的如递归获取数组的键并创建下划线分隔的字符串的封装变体。

这些键对结果数组的访问(这里是set)(例如:使用字符串访问(可能很大的)多维数组,但还有更好的例子)仅仅是通过一些引用直接进行的。

对于给定的输入,那么结果是:

Array
(
    [0] => Array
        (
            [2] => ram kumar
            [0] => kumar
        )
    [1] => Array
        (
            [0] => Array
                (
                    [0] => rajesh kumar
                )
        )
)

相关内容

  • 没有找到相关文章

最新更新