2013-08-08 3 views
1

У меня есть массив с именем «меню», которое, если положить через print_r, в настоящее время выдает:регулярного выражения для поиска массива ключей

Array ([4_00] => Array ([0] => 1), [3_00] => Array ([0] => 1), [7_00] => Array ([0] => 1)) 

Я хочу создать выражение, которое будет искать этот массив для любых ключей, начиная с '4_'. Я пробовал с этим:

$matches = preg_grep('/^4_/', $menu); 

Но это не работает.

Любая помощь?

Высокой оценки

+0

Можете ли вы объяснить, почему? Если вам просто нужно совместить первые 2 символа, как насчет 'substr ($ key, 0, 2) ===" 4_ "'? – Halcyon

+0

Хотите вернуть только ключи? –

ответ

1

Я думаю, что функция плохо определена в руководстве. Функция preg_grep возвращает массив ключей, где значение массива соответствует регулярному выражению.

Вы должны были бы функцию like this для того, чтобы работать, как ожидалось

function preg_grep_keys($pattern, $input, $flags = 0) { 
    $keys = preg_grep($pattern, array_keys($input), $flags); 
    $vals = array(); 
    foreach ($keys as $key) { 
     $vals[$key] = $input[$key]; 
    } 
    return $vals; 
} 

И если вы хотите, чтобы держать вещи действительно туго, вы можете даже пойти like this

function preg_grep_keys($pattern, $input, $flags = 0) { 
    return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags))); 
} 
+0

Это было довольно быстро, это какая-то фиктивная учетная запись? – HamZa

+0

Да, мне было интересно то же самое. Ответ появился примерно через 45 секунд после того, как был задан вопрос, не говоря уже о промежуточном редактировании. –

3

Что не так с хорошим старым foreach циклом и сравнением строк? Он выполняет свою работу.

$results = array(); 
foreach ($menu as $key => $val) { 
    if (strncmp($key, '4_', 2) === 0) { 
     $results[] = array($key, $val); 
    } 
} 
print_r($results); 
Смежные вопросы