Скажем, моя переменная $_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_*']
EDITED ANSWER – коррекция impt для ответа @chris: $_POST
должен быть первым аргументом для array_intersect_key
, например:
$empl_POST = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST))));
$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
теперь имеет несколько новых флагов, которые позволяют вам получить доступ к ключу массива в 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);
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_");
,
$empl_post = array(); foreach ($_POST as $k => $v) { if (strpos($k, 'empl_') !== 0) continue; $empl_post[substr($k, 5)] = $v } print_r($empl_post);
Другой метод:
$formVars = $_POST; foreach ($formVars as $key=>$value) { if (strpos($key, 'empl_')===false) unset($formVars[$key]); }
не$formVars = $_POST; foreach ($formVars as $key=>$value) { if (strpos($key, 'empl_')===false) unset($formVars[$key]); }
Если вы хотите что-то вроде этого
$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); }
Вот крутой ультра-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]); } }
с$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, с копией массива значений и префиксной строкой.
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 ") ;.