【问题标题】:Recursive search for partial value matches in an PHP multidimensional Array递归搜索 PHP 多维数组中的部分值匹配
【发布时间】:2014-06-21 23:52:11
【问题描述】:

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

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
        )

)

但我只需要原始数组维度的匹配值和部分匹配值。

处理此问题的有效/最佳方法是什么?我的数组有近 200 000 条记录(可能会增加),这个数组对我的网站来说是全局的(就像数据库一样)。

【问题讨论】:

    标签: php recursion search multidimensional-array


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 嗨哈克雷,感谢您的回复。有没有其他方法可以做这些事情?或者这是最好的方法?请建议我......因为我的数组有近 20 万条记录(可能会增加),而且这个数组对于我的网站来说是全局的(比如数据库)。
      猜你喜欢
      • 2016-01-02
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2014-09-07
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多