Я могу представить себе способ, которым вам не пришлось бы зацикливаться (по крайней мере, на себе):
<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
)
)