Php - поиск ключей в массиве, который соответствует шаблону
У меня есть массив, который выглядит так:
Array ( [2.5] => ABDE [4.8] => Some other value )
Как мне найти пару ключей/значений, где ключ соответствует шаблону? Я буду знать значение первой цифры в ключе, но не второе. поэтому, например, используя префикс "2.", я хочу как-то найти ключ "2.5" и вернуть как ключ, так и значение "ABDE".
Я думал об использовании регулярного выражения с таким шаблоном, как:
$prefix = 2;
$pattern = '/'.$prefix.'\.\d/i';
а затем цикл через массив и проверку каждого ключа. (кстати, только для демонстрационных целей префикс $был жестко закодирован до 2, но в реальной системе это значение предоставляется пользователем).
Мне интересно, есть ли более простой способ сделать это?
Спасибо.
Ответы
Ответ 1
вы можете просто перебрать массив и проверить клавиши
$array = array(...your values...);
foreach($array as $key => $value) {
if (preg_match($pattern,$key)){
// it matches
}
}
Вы можете обернуть его в функцию и передать свой шаблон в качестве параметра
Ответ 2
Я думаю, вам нужно что-то вроде этого:
$keys = array_keys($array);
$result = preg_grep($pattern, $keys);
Результатом будет массив, содержащий все ключи, соответствующие регулярному выражению. Клавиши могут использоваться для получения соответствующего значения.
Посмотрите на функцию preg_grep.
Ответ 3
Старый вопрос, но вот что мне нравится делать:
$array = [ '2.5' => 'ABDE', '4.8' => 'Some other value' ];
preg_grep
+ array_keys
найдет все клавиши
$keys = preg_grep( '/^2\.\d/i', array_keys( $array ) );
Вы можете добавить array_intersect_key
и array_flip
, чтобы извлечь фрагмент массива, соответствующий шаблону
$vals = array_intersect_key( $array, array_flip( preg_grep( '/^2\.\d/i', array_keys( $array ) ) ) );
Ответ 4
Это мои пути
$data = ["path"=>"folder","filename"=>"folder/file.txt","required"=>false];
// FIRST WAY
$keys = array_keys($data);
if (!in_array("path", $keys) && !in_array("filename",$keys) && !in_array("required",$keys)) {
return myReturn(false, "Dados pendentes");
}
// SECOND WAY
$keys = implode("," array_keys($data));
if (!preg_match('/(path)|(filename)|(required)/'), $keys) {
return myReturn(false, "Dados pendentes");
}
Ответ 5
Чтобы получить только часть массива с соответствующими ключами, вы также можете написать
$matching_array = array_flip(preg_grep($pattern, array_flip($your_array)));
Это может привести к проблемам с производительностью, если ваш массив становится слишком большим.
Ответ 6
Для будущих программистов, которые сталкиваются с той же проблемой. Вот более полное решение, которое не использует циклы.
$array = ['2.5'=> 'ABCDE', '2.9'=>'QWERTY'];
$keys = array_keys($array);
$matchingKeys = preg_grep('/^2\.+/', $keys);
$filteredArray = array_intersect_key($array, array_flip($matchingKeys));
print_r($filteredArray);