0

前几天,我收到了一组庞大的数组,并被告知要制作一个带有一堆或选择/单选按钮的 HTML 页面,所以我编写了一些简单的函数来简化事情。

这是我生成非常大的 HTML 选择的功能。

function genSelect($name) {
    $selectReturn = '<select name="'.$name.'">';
        foreach(${$name} as $value=>$text){
            $selectReturn .= '<option value="'.$value.'"';
            if($evalThis->loaded_settings[$name]['value']==$value)
                $selectReturn .= ' SELECTED ';
            $selectReturn .= '>'.$text.'</option>';
        }
    $selectReturn .= '</select>';
return $selectReturn;
}

这似乎不起作用,因为${$name}根本没有像我期望的那样调用任何东西/工作。我已经有一个解决方法,我只是通过函数调用传递数组,但它一直在困扰我,我在这段代码中的变量变量做错了什么。

编辑:为了给出一些上下文,这是在 joomla 视图中加载的,以构建用于输入设置的巨大 UI。这个函数在一个 lib 文件中,并与require_once另一个包含我使用的所有数组的文件一起加载。数据库仅保存这些设置的当前值,并且数组包含各种选择/单选/下拉菜单的所有可能选项,并且出于语言/翻译原因集中在单独的文件中。

澄清人们提出的一些问题,$name只包含所用数组的名称以及 HTML 选择/收音机/复选框输入的名称。$evalThis是一个包含数据库当前拥有的值的数组。

4

2 回答 2

1

似乎一个名称存储在 $name 中的数组是在全局上下文中定义的,而不是在这个函数中。

$somearr = array('x', 'y');
function genSelect($name) {
    $selectReturn = '<select name="'.$name.'">';

    foreach(${$name} as $value=>$text){
        $selectReturn .= '<option value="'.$value.'"';
        if($evalThis->loaded_settings[$name]['value']==$value)
            $selectReturn .= ' SELECTED ';
        $selectReturn .= '>'.$text.'</option>';
    }

    $selectReturn .= '</select>';
    return $selectReturn;
}
echo genSelect('somearr'); //doesnt work, somearr is global


$somearr = array('x', 'y');
function genSelect($name) {
    global $somearr;
    $selectReturn = '<select name="'.$name.'">';

    foreach(${$name} as $value=>$text){
        $selectReturn .= '<option value="'.$value.'"';
        if($evalThis->loaded_settings[$name]['value']==$value)
            $selectReturn .= ' SELECTED ';
        $selectReturn .= '>'.$text.'</option>';
    }

    $selectReturn .= '</select>';
    return $selectReturn;
}
echo genSelect('somearr'); //works, note 'global $somearr' line at the beginning of genSelect

通常,在没有必要/至少合理的情况下使用函数/数组的变量名称是非常糟糕的设计。如果我是你,我只会将方法重写为

function genSelect($array, $name) { ... }

echo genSelect($someArr, 'someArr');

这看起来像是重复输入,但最好不要让您的方法依赖于全局范围。顺便说一句,您的 $evalThis var 也超出了函数范围。

于 2012-01-03T22:31:43.183 回答
1

问题是${$name}没有在函数的范围内定义。您需要像这样引用全局变量:

$GLOBALS[$name]  // bad

或者在函数顶部添加:

global ${$name};  // worse

警告: 这太可怕了。不要这样做:-) 我建议像你之前提到的那样简单地传递数组。

于 2012-01-03T22:33:17.127 回答