10

私の$_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_. それらすべてを 1 つずつ指定する必要はありませんが、すべてのフォーム変数を$_POST最小コストでできればエレガントな方法で配列に取得するにはどうすればよいですか? これに使用できるPHP配列関数またはそれらの組み合わせはありますか?

usingCSSで始まるクラスですべての要素を選択できる場合と同様に、PHP の配列キーを使用してこれを行う方法はありますか?empl[class*="empl_"]

$empl_post = $_POST['empl_*']

編集済みの回答 - @chris の回答に対する修正を修正:$_POST最初の引数にする必要がありますarray_intersect_key。例:

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

8 に答える 8

17
$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);
于 2012-05-14T13:17:06.220 に答える
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;
}

次に、で呼び出します$myArray = GetPrefixedItemsFromArray($_POST, "empl_");

于 2012-05-14T12:47:34.613 に答える
2
$empl_post = array();
foreach ($_POST as $k => $v) {
    if (strpos($k, 'empl_') !== 0) continue;
    $empl_post[substr($k, 5)] = $v
}

print_r($empl_post);
于 2012-05-14T12:45:38.273 に答える
0

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

これで、値の配列のコピーとプレフィックス文字列を使用して、arraywalkを呼び出すことができます。

于 2012-05-14T13:18:33.350 に答える
0
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 ");で呼び出すだけです。

于 2014-02-17T10:48:04.610 に答える
0

別の方法:

$formVars = $_POST;
foreach ($formVars as $key=>$value) {
    if (strpos($key, 'empl_')===false) 
        unset($formVars[$key]);
}
于 2012-05-14T13:04:33.313 に答える
0

このようなものが欲しい場合

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

}
于 2012-05-14T13:06:17.973 に答える
0

PHP 5.6 以降では、オプション ARRAY_FILTER_USE_KEY とともに array_filter を使用できます。

$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 に直接アクセスすることは推奨されず、2 番目のパラメーターを指定しない filter_input_array は FILTER_UNSAFE_RAW にフォールバックします。

于 2018-10-04T08:54:38.613 に答える