Intereting Posts
Как автоматически избежать строк в запросе PHP SQL? Symfony2 – определить, находится ли пользователь в защищенном брандмауэре SQLSTATE : нарушение кардинальности: 1241 Операнд должен содержать 1 столбец (столбцов) Ошибка QuickBooks API при обновлении Ошибка передачи переменных в PHP-скрипт при загрузке изображений Что более эффективно для отправки обновлений WebSocket с изменением базы данных MySQL Как создать страницу 404 на сервере WAMP Как проверить транзакции Android в приложении для биллинга на моем сервере? Только переменные должны передаваться по ссылке … в строке 13 Fail PHP __call эквивалент для java Как сделать текстовый DIFF с помощью PHP? move_uploaded_file (…): не удалось открыть поток: разрешение отклонено в … Использование Mac OS X Mountain Lion Уничтожение сеанса PHP Невозможно получить доступ к объявленной глобальной переменной в WordPress Экспорт таблицы HTML в csv в браузере Chrome Chrome

Как получить подмножество массива $ _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_*'] 

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 ") ;.