Как получить подмножество массива $_POST с ключами, начинающимися с префикса
Скажем, моя переменная $_POST
выглядит так:
<?php
Array
(
[user_ID] => 65
[action] => editpost
[originalaction] => editpost
[post_author] => 154
[empl_bd_dd] => 6
[empl_bd_mm] => 5
[empl_bd_yy] => 1987
[empl_gen] => 1
[empl_height] => 155
[empl_weight] => 61
[empl_arra] => 2
[save] => Update
[post_it] => 2
[empl_pay] => J77
[empl_cust] => Married
[empl_lang] => Array
(
[0] => EN
[1] => FR
)
[empl_rent] => 1
[name] => Jimmy Nathan
[empl_text] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sed interdum leo. Sed et elit quam, tempor placerat neque. Nullam sapien odio, egestas iaculis dictum ut, congue ullamcorper tellus.
[empl_sk_0] => 6
[empl_sk_1] => 7
[empl_sk_2] => 5
)
?>
Как вы видите, я префикс всех моих переменных формы с помощью empl_
. Не имея необходимости указывать все из них один за другим, как мне получить все мои переменные формы из $_POST
в массив в наименее дорогостоящем, мы надеемся, элегантном? Есть ли функция массива PHP или их комбинация, которую я могу использовать для этого?
Как и в CSS
, где вы можете выбрать все элементы с классом, начинающимся с empl
с помощью [class*="empl_"]
, есть ли способ сделать это с помощью ключей массива в PHP, например.
$empl_post = $_POST['empl_*']
ОТДЕЛЬНЫЙ ОТВЕТ - коррекция impt для ответа @chris: $_POST
должен быть первым аргументом array_intersect_key
, например:
$empl_POST = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST))));
Ответы
Ответ 1
$r = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST))));
им действительно нужно добавить флаг PREG_GREP_KEYS
в preg_grep()
, поэтому нам не нужно делать все это беспорядок...
Как функция:
function preg_grep_keys($pattern, $input, $flags = 0) {
return array_intersect_key(
$input,
array_flip(preg_grep(
$pattern,
array_keys($input),
$flags
))
);
}
Изменить - поскольку php 5.6 array_filter
теперь имеет несколько новых флагов, которые позволяют вам получить доступ к ключу массива в обратном вызове фильтра.
function preg_grep_keys($pattern, $input, $flags = 0) {
return array_filter($input, function($key) use ($pattern, $flags) {
return preg_match($pattern, $key, $flags);
}, ARRAY_FILTER_USE_KEY);
}
использовать
$filtered = preg_grep_keys('/^empl_/', $_POST);
Ответ 2
function GetPrefixedItemsFromArray($array, $prefix)
{
$keys = array_keys($array);
$result = array();
foreach ($keys as $key)
{
if (strpos($key, $prefix) === 0)
{
$result[$key] = $array[$key];
}
}
return $result;
}
Затем просто вызовите с помощью $myArray = GetPrefixedItemsFromArray($_POST, "empl_");
.
Ответ 3
$empl_post = array();
foreach ($_POST as $k => $v) {
if (strpos($k, 'empl_') !== 0) continue;
$empl_post[substr($k, 5)] = $v
}
print_r($empl_post);
Ответ 4
Другой метод:
$formVars = $_POST;
foreach ($formVars as $key=>$value) {
if (strpos($key, 'empl_')===false)
unset($formVars[$key]);
}
Ответ 5
Если вы хотите что-то вроде этого
$keyPattern = '/^empl_*/';
$matching_array = getArrayElementsWithMatchingKeyPattern($_POST,$keyPattern);
Тогда я не думаю, что есть встроенный способ.
Лучший способ - это цикл foreach с регулярным выражением.
function getArrayElementsWithMatchingKeyPattern($array,$keyPattern){
$matching_array = array();
foreach ($keyPattern as $k => $v) {
if (preg_match($array[$k],$keyPattern) > 0)
$matching_array[$k] = $v;
}
return ($matching_array);
}
Ответ 6
Здесь прохладный ультра-php-аккуратный способ использовать php array_walk, чтобы указать общий префикс для удаления:
$foo = array('k_foo' =>"bar",
'k_bar' =>"b0r",
'y_foo' =>"b5r",
'y_not' =>"b7r",
'k_not' =>"b1r");
$subsetArray = $foo;
$key_prefix = "k_";
array_walk($foo, 'removeUnwanted', array(&$subsetArray, $key_prefix));
var_dump ($subsetArray);
function removeUnwanted($value, $key, $array){
$prefix = $array[1];
$testArray = &$array[0];
if(strpos($key,$prefix) ===0){
unset($testArray[$key]);
}
}
Теперь вы можете просто вызвать массив walk, с копией массива значений и строкой префикса.
Ответ 7
function GetPrefixedItemsFromArray($array, $prefix, $remplacePref=FALSE) {
$keys = array_keys($array);
$result = array();
foreach ($keys as $key) {
if (strpos($key,$prefix) === 0) {
if($remplacePref===TRUE){
$result[str_replace($prefix, "", $key)] = $array[$key];
}
elseif($remplacePref!==FALSE && $remplacePref!==""){
$result[str_replace($prefix, $remplacePref, $key)] = $array[$key];
}
else{
$result[$key] = $array[$key];
}
}
}
return $result;
}
Затем просто вызовите с помощью $myArray = GetPrefixedItemsFromArray ($ POST, "empl" );