【问题标题】:How to get a subset of $_POST array with keys starting with a prefix如何使用以前缀开头的键获取 $_POST 数组的子集
【发布时间】:2012-05-14 12:43:11
【问题描述】:

假设我的 $_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 中一样,您可以使用[class*="empl_"] 选择以empl 开头的类的所有元素,有没有办法可以使用PHP 中的数组键来做到这一点,例如

$empl_post = $_POST['empl_*']

编辑答案 - 对@chris 的答案进行修正:$_POST 必须是array_intersect_key 的第一个参数,例如:

$empl_POST = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST))));

【问题讨论】:

  • 感谢所有答案。在下面选择了@chris 的答案。正是我要找的。再次感谢大家,你们都摇滚。

标签: php arrays array-key


【解决方案1】:
$r = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST))));

他们确实需要在preg_grep() 中添加一个PREG_GREP_KEYS 标志,这样我们就不必做那些乱七八糟的事情了...

作为一个函数:

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

【讨论】:

  • “他们真的需要添加PREG_GREP_KEYS 标志...” - ikr??少一个功能。 :D
  • 一个重要的变化:$_POST 必须是array_intersect_key 的第一个参数。再次感谢@chris
【解决方案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);

【讨论】:

  • 使用strpos($k, 'empl_') !== 0 更容易
【解决方案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 array_walk 指定要删除的通用前缀的一种很酷的超 php-neat 方法:

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

        【讨论】:

          【解决方案8】:

          从 PHP 5.6 开始,您可以将 array_filter 与选项 ARRAY_FILTER_USE_KEY 一起使用。

          $employee = array_filter(filter_input_array(INPUT_POST), function($key) {
            return strpos($key, 'empl_') === 0;
          }, ARRAY_FILTER_USE_KEY);
          

          出于安全考虑,您可以根据需要将 FILTER_SANITIZE_* 添加到 filter_input_array 函数中,不建议直接访问 $_POST 并且不带第二个参数的 filter_input_array 会退回到 FILTER_UNSAFE_RAW。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-09-20
            • 2021-10-12
            • 2019-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多