如何使用以前缀开头的键获取$ _POST数组的子集

Ana*_*Ban 10 php arrays array-key

假设我的$_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
)

?>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将所有表单变量作为前缀empl_.如果不必一个一个地指定所有这些,我如何$_POST以最低成本希望优雅的方式将所有表单变量从一个数组中获取?我可以使用PHP数组函数或它们的组合吗?

就像在CSS那里你可以选择所有带有以empl使用开头的类的元素一样[class*="empl_"],有没有办法可以用PHP中的数组键来做到这一点,例如

$empl_post = $_POST['empl_*']
Run Code Online (Sandbox Code Playgroud)

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

$empl_POST = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST))));
Run Code Online (Sandbox Code Playgroud)

goa*_*oat 16

$r = array_intersect_key($_POST, array_flip(preg_grep('/^empl_/', array_keys($_POST))));
Run Code Online (Sandbox Code Playgroud)

他们真的需要添加一个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
        ))
    );
}
Run Code Online (Sandbox Code Playgroud)

编辑 - 因为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);
}
Run Code Online (Sandbox Code Playgroud)

使用

$filtered = preg_grep_keys('/^empl_/', $_POST);
Run Code Online (Sandbox Code Playgroud)


Cod*_*ter 6

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;
}
Run Code Online (Sandbox Code Playgroud)

然后简单地打电话给$myArray = GetPrefixedItemsFromArray($_POST, "empl_");.