поиск по всем ключам в многомерном массиве PHP - PullRequest
2 голосов
/ 29 апреля 2011

Я хочу найти все ключи в многомерном массиве для конкретной строки. Мне просто нужно разобраться, если это настоящее, не более того. Я хочу знать, присутствует ли IP-адрес посетителя в любом из массивов.

Есть ли функция или метод php, которые я могу использовать для этого, каждый из которых я пробовал, всегда возвращает false. (in_array, array_search, array_filter)

Я надеялся избежать зацикливания каждого ключа и набора значений.

Пример массива

Array
(
    [21] => Array
        (
            [click_id] => 21
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:56:57
            [url_id] => 11
        )

    [22] => Array
        (
            [click_id] => 22
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:57:05
            [url_id] => 12
        )

    [23] => Array
        (
            [click_id] => 23
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 18:42:42
            [url_id] => 10
        )
)

Спасибо

Ответы [ 3 ]

1 голос
/ 30 апреля 2011

Я могу представить себе способ, которым вам не пришлось бы зацикливаться (по крайней мере, на себе):

<code>$term = preg_quote('109.148.183.1', '~'); // lets make sure it's safe
$result = array_map('unserialize', preg_filter('~' . $term . '~', '$0', array_map('serialize', $data)));

echo '<pre>';
print_r($result);
echo '
';

С данными вашего примера:

$data = array
(
    21 => array
    (
        'click_id' => 21,
        'ip_addr' => '109.148.183.1',
        'dtime' => '2011-04-28 17:56:57',
        'url_id' => 11,
    ),

    22 => array
    (
        'click_id' => 22,
        'ip_addr' => '109.148.183.1',
        'dtime' => '2011-04-28 17:57:05',
        'url_id' => 12,
    ),

    23 => array
    (
        'click_id' => 23,
        'ip_addr' => '109.148.183.1',
        'dtime' => '2011-04-28 18:42:42',
        'url_id' => 10,
    ),
);

Правильно возвращает ключи (21, 22 и 23), которые имеют значение 109.148.183.1:

Array
(
    [21] => Array
        (
            [click_id] => 21
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:56:57
            [url_id] => 11
        )

    [22] => Array
        (
            [click_id] => 22
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:57:05
            [url_id] => 12
        )

    [23] => Array
        (
            [click_id] => 23
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 18:42:42
            [url_id] => 10
        )
)

И поскольку это регулярное выражение, мы можем выполнять еще более мощный поиск, например, для поиска всех 2011-04-28 дат, которые имеют нечетное число секунд :

<code>$term = '2011-04-28 [0-9]{2}:[0-9]{2}:[0-9][13579]';
$result = array_map('unserialize', preg_filter('~' . $term . '~', '$0', array_map('serialize', $data)));

echo '<pre>';
print_r($result);
echo '
';

А на выходе:

Array
(
    [21] => Array
        (
            [click_id] => 21
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:56:57
            [url_id] => 11
        )

    [22] => Array
        (
            [click_id] => 22
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:57:05
            [url_id] => 12
        )
)
0 голосов
/ 29 апреля 2011
$matching_keys = array();

function search ($item, $key) {
  global $matching_keys();
  // do your testing here, stuff matches in $matching_keys, or however you wanna do it
}
array_walk_recursive($array, 'search');

В качестве альтернативы вы можете написать свою собственную рекурсивную функцию и избежать использования глобальных. Это просто самый прямой путь.

0 голосов
/ 29 апреля 2011

Никогда не избежать цикла: -)

function search($array, $searchString){
   foreach($array as $key=>$val){
        if(in_array($searchString, $val)) return true;
   }
   return false;
}

//use it like so:
if(search($array, '109.148.183.1')){/*do something*/}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...