【问题标题】:Search multidimensional array using regular expressions in PHP and return keys在 PHP 中使用正则表达式搜索多维数组并返回键
【发布时间】:2014-03-13 14:18:27
【问题描述】:

此问题与以下问题有关: 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

例如用户在搜索“ham”、“tools”、“amm”等时可以找到这个数组键。

我试图调整上面帖子中发布的解决方案,但没有成功。我还找到了使用 array_map 的解决方案,但这不能让我显式搜索特定属性(例如,我想进一步将搜索限制为数组中的第一个索引,此处为 [0] => 锤子) :

$result= array_map('unserialize', preg_filter('/'.$searchterm.'/', '$0', array_map('serialize', $array)));

欢迎您的想法 :) 谢谢!

【问题讨论】:

    标签: php regex arrays multidimensional-array


    【解决方案1】:

    尝试以下解决方案。它不使用正则表达式,而是使用纯字符串搜索。但是,它允许您根据需要提供一些灵活性。

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

    【讨论】:

    • 该示例运行良好!我仍然尝试将它与 reg ex 结合起来——也在搜索整个谷歌——但还没有找到解决方案。即使使用 OR 搜索似乎也不起作用。
    【解决方案2】:

    你可以使用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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      相关资源
      最近更新 更多