我有一个关于将变量用作variablename的问题。 我有一个数据库字段名作为键和对象属性作为值的数组 像这样:
$properties = array("userid" => "user['userid']", "city" => "hometown");
foreach ($properties as $field => $property ) {
$value1 = $db->$field;
$value2 = $obj->$property;
}
这适用于物业家乡但不适用于物业用户['用户ID']。
地址变量的正确方法是什么?
我还尝试了几件事:$ {property}或{$ property}但是没有运气。
编辑: 感谢所有的回复!现在我会继续使用我原来的解决方案,我想知道是否有办法,我不会对eval版本存在主要问题,请记住这一点!
foreach ($fields as $field => $property ) {
switch ($field) {
case "userid":
$newvalue = $this->user['userid'];
$oldvalue = $original->user['userid'];
break;
// more cases ...
default:
$newvalue = $this->{$property};
$oldvalue = $original->($property};
}
....
答案 0 :(得分:0)
如果$obj
是一个对象并且有一个字段$property
$obj->{$property}
应该正常工作
你也可以使用带有连接字符串的花括号,如:
$obj->{ "field_" . $field_name };
在你的情况下,$property
是一个字符串,所以在第一次迭代时它将是user['userid']
编辑以使其成为二维数组$properties
必须像这样定义:
$properties = array(
'user' => array(
'id' => 1,
'name' => 'username'
),
'city' => 'hometown'
);
答案 1 :(得分:0)
你的问题是你有一个数组索引,但PHP的“变量”语法不支持这种方法。
我知道这有点神奇,但你可以这样做而不使用邪恶的eval()
。
请注意:这只是一个概念证据,表明它是可能的。
你真正应该做的是以某种方式重构你的代码,以便不需要这样的黑客。
$bar = "hallo";
$foo['bar']['baz'] = "hallo2";
$properties = array('bar', "foo['bar']['baz']");
// DOES NOT WORK
foreach ($properties as $property)
echo "$property = ", $$property, "\n";
/* Results in:
* bar = hallo
* foo['bar']['baz'] = PHP Notice: Undefined variable: foo['bar']['baz'] in /tmp/test.php on line 8
*/
// DOES WORK
foreach ($properties as $property)
echo "$property = ", get_var($property), "\n";
/* Results in:
* bar = hallo
* foo['bar']['baz'] = hallo2
*/
// dark magic starts here
function get_var($name) {
if (strpos($name, '[') === false) {
global $$name;
return $$name;
} else {
// split variable name into array name and nested index segments
preg_match_all("#[^\[\]\"']+#", $name, $parts);
$parts = $parts[0];
// get pointer to array and walk down to the desired (nested) index
$varname = array_shift($parts);
global $$varname;
$pointer =& $$varname;
foreach ($parts as $index) {
$pointer =& $pointer[$index];
}
return $pointer;
}
}
答案 2 :(得分:-1)
但要注意,如果输入来自外部来源,那么你应该过滤它。
$properties = array("userid" => "user['userid']", "city" => "hometown");
foreach ($properties as $field => $property ) {
$value1 = $db->$field;
eval("\$value2=\$obj->$property;");
}