Как искать шаблоны в нескольких массивах в PHP? - PullRequest
2 голосов
/ 07 июля 2011

У меня есть массив, который выглядит следующим образом:

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 ]

1 голос
/ 07 июля 2011

Я бы использовал preg_grep:

http://php.net/manual/en/function.preg-grep.php

0 голосов
/ 07 июля 2011

Мне кажется, я нашел гораздо более простой способ использования serialize().

$mymultiarrays = serialize($mymultiarrays);
echo preg_match( '/google/', $mymultiarrays; 
0 голосов
/ 07 июля 2011
$filtered = array_filter($array, function ($value) { return strpos($value['host'], 'google') !== false; });

$filtered будет содержать все записи, где host содержит "google".Требуется PHP 5.3.Возможно, используйте это с preg_grep вместо strpos, как предложено @Aaron Ray, если вас интересует любое поле, а не только host.


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

Заменяет все значения на true или false в зависимости от того, содержит ли оно поисковый запрос.Не уверен, что вы использовали бы это для хотя ...:)


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

Возвращает одно логическое значение, независимо от того, существует ли значение во всем массиве.

0 голосов
/ 07 июля 2011

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

если вы выполняете print_r () для $ example_array, вот как выглядит структура массива:

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
)
0 голосов
/ 07 июля 2011

Я бы зациклился и использовал strpos ()

Вот примечание от php.net, которое можно найти на странице preg_match ().

Не используйте preg_match (), если вы хотите проверить, содержится ли одна строка в другой.Вместо этого используйте strpos () или strstr (), так как они будут быстрее.

0 голосов
/ 07 июля 2011

Вы можете использовать функцию array_map , которая отображает обратный вызов (имя функции, имя метода в виде массива объекта и имя метода или лямбда-выражение) для каждого элемента в массиве.

Если вы хотите, чтобы я уточнил, просто спросите. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...