如何在PHP中搜索多个数组中的模式?

时间:2011-07-06 20:07:40

标签: php arrays design-patterns

我有一个如下所示的数组:

Array (
    [0] => Array (
        [host] => google.com
        [type] => NS
        [target] => ns2.google.com
        [class] => IN [ttl] => 112756
    )
    [1] => Array (
        [host] => google.com
        [type] => NS
        [target] => ns1.google.com
        [class] => IN
        [ttl] => 112756
    )
    [2] => Array (
        [host] => google.com
        [type] => NS
        [target] => ns3.google.com
        [class] => IN
        [ttl] => 112756
    )
    [3] => Array (
        [host] => google.com
        [type] => NS
        [target] => ns4.google.com
        [class] => IN
        [ttl] => 112756
    )
)

我想搜索模式*google*。不确定用于执行此操作的功能。 in_array似乎不喜欢正则表达式或搜索多个数组。

6 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

您可以使用array_map函数,该函数将回调(函数名称,方法名称作为对象数组和方法名称,或lambda)映射到数组中的每个元素。

如果你想要我详细说明,请问。 :)

答案 2 :(得分:0)

我会循环并使用strpos()

以下是来自php.net的说明,可以在preg_match() page.

找到
  

如果您只是使用preg_match()   想检查是否有一个字符串   包含在另一个字符串中使用   strpos()或strstr()代替它们   会更快。

答案 3 :(得分:0)

array_map和preg_match

$example_array[] = array(
    'host'      => 'google.com',
    'type'      => 'NS',
    'target'    => 'ns2.google.com',
    'class'     => 'IN',
    'ttl'       => 112756
);

$example_array[] = array(
    'host'      => 'google.com',
    'type'      => 'NS',
    'target'    => 'ns1.google.com',
    'class'     => 'IN',
    'ttl'       => 112756
); 

$example_array[] = array(
    'host'      => 'yahoo.com',
    'type'      => 'NS',
    'target'    => 'ns1.yahoo.com',
    'class'     => 'IN',
    'ttl'       => 112756
); 

如果在$ example_array上执行print_r(),这就是数组结构的样子:

echo print_r($example_array,true)."\n";

输出:

Array
(
    [0] => Array
        (
            [host] => google.com
            [type] => NS
            [target] => ns2.google.com
            [class] => IN
            [ttl] => 112756
        )

    [1] => Array
        (
            [host] => google.com
            [type] => NS
            [target] => ns1.google.com
            [class] => IN
            [ttl] => 112756
        )

    [2] => Array
        (
            [host] => yahoo.com
            [type] => NS
            [target] => ns1.yahoo.com
            [class] => IN
            [ttl] => 112756
        )

)

功能

function look4($haystack, $needle = 'google') {
    return preg_match("/$needle/i", $haystack);
}

// instead of $example_array use your array here
foreach($example_array as $sub_array) {
    $results = array_map("look4", $sub_array);
    print_r($results);
}

结果(0(零)的值是错误匹配,值1(一)是真匹配):

Array
(
    [host] => 1
    [type] => 0
    [target] => 1
    [class] => 0
    [ttl] => 0
)
Array
(
    [host] => 1
    [type] => 0
    [target] => 1
    [class] => 0
    [ttl] => 0
)
Array
(
    [host] => 0
    [type] => 0
    [target] => 0
    [class] => 0
    [ttl] => 0
)

答案 4 :(得分:0)

$filtered = array_filter($array, function ($value) { return strpos($value['host'], 'google') !== false; });

$filtered将包含host包含"google"的所有条目。需要PHP 5.3。如果您对任何字段感兴趣,而不仅仅是preg_grep,则可以使用strpos而不是host,如@Aaron Ray所建议的那样。


array_walk_recursive($array, function ($value) { return strpos($value, 'google') !== false; });

根据是否包含搜索字词,这会将所有值替换为truefalse。虽然不确定你用的是什么......:)


$termExists = array_reduce($array, function ($found, $value) {
    return $found || preg_grep('/google/', $value);
});

这将返回一个布尔值,无论该值是否存在于整个数组中。

答案 5 :(得分:0)

我认为我使用serialize()找到了一种更简单的方式。

$mymultiarrays = serialize($mymultiarrays);
echo preg_match( '/google/', $mymultiarrays;