関数があります。これは、extract() よりも安全に変数を抽出する方法です。
基本的に、配列から取り出す変数名を指定するだけです。
問題は、 extract() のように、これらの変数を「現在のシンボル テーブル」にどのように挿入するかということです。(つまり、関数内のローカル変数のスコープ)。
今のところ、グローバル変数にすることによってのみこれを行うことができます:
/**
* Just like extract(), except only pulls out vars
* specified in restrictVars to GLOBAL vars.
* Overwrites by default.
* @param arr (array) - Assoc array of vars to extract
* @param restrictVars (str,array) - comma delim string
* or array of variable names to extract
* @param prefix [optional] - prefix each variable name
* with this string
* @examples:
* extract2($data,'username,pswd,name','d');
* //this will produce global variables:
* // $dusename,$dpswd,$dname
*/
function extract2($arr,$restrictVars=null,$prefix=false)
{
if(is_string($restrictVars))
$restrictVars=explode(",",$restrictVars);
foreach ($restrictVars as $rvar) {
if($prefix) $varname="$prefix$rvar";
else $varname=$rvar;
global ${$varname};
${$varname}=$arr[$rvar];
}
}
使用法:
extract2($_POST,"username,password,firstname");
echo "Username is $username";
物事がうまくいかない場所...関数内:
function x($data)
{
extract2($data,"some,var,names,here");
//now the variables are are global, so you must:
global $some,$var,$names,$here;
}
グローバルを回避し、代わりに var をローカル var スコープに挿入する方法はありますか?