变量名称为变量

时间:2012-02-21 08:27:25

标签: php variables

我有一个关于将变量用作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};
        } 
        ....

3 个答案:

答案 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)

好的,所以我决定评论这个问题。 Kai(没有冒犯:)为您提供了一个不使用eval的解决方案,但是代价是额外的12行代码,这使得代码无疑更慢,更复杂。所以我自己认为在这种情况下,使用eval()调用是合理的。 Hovewer,这可能只是我(我非常重视清晰和简短的代码)。

但要注意,如果输入来自外部来源,那么你应该过滤它。

$properties = array("userid" => "user['userid']", "city" => "hometown");

foreach ($properties as $field => $property ) { 
  $value1 = $db->$field;
  eval("\$value2=\$obj->$property;");
}