使用PHP中的正则表达式搜索多维数组并返回键

时间:2014-03-13 14:18:27

标签: php regex arrays multidimensional-array

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

e.g。在搜索“ham”,“tools”,“amm”等时,用户可以找到这个数组键。

我尝试调整上面帖子中发布的解决方案,但没有管理它。我也找到了一个使用array_map的解决方案,但这并没有让我明确搜索一个特定的属性(例如我想进一步限制搜索到数组中的第一个索引,这里[0] =>锤子):

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

欢迎您的想法:) 谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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