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}単に何も呼び出さない/私が期待するように機能するからです。関数呼び出しを介して配列を渡すだけの回避策はすでにありますが、このコードの変数変数で間違っていたことを悩ませています。

編集:いくつかのコンテキストを与えるために、これは設定を入力するための巨大なUIを構築するためにjoomlaビューにロードされています。この関数はlibファイルにあり、require_once使用するすべての配列を含む別のファイルと一緒にロードされます。データベースはこれらの設定の現在の値のみを保持し、配列にはさまざまな選択/ラジオ/ドロップダウンメニューのすべての可能なオプションが含まれており、言語/翻訳の理由から別のファイルに一元化されています。

人々が尋ねたいくつかの質問を明確$nameにするために、使用された配列の名前とHTML select / radio/checkbox入力の名前が含まれているだけです。$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変数も関数スコープ外です。

于 2012-01-03T22:31:43.183 に答える
1

問題は${$name}、関数のスコープ内で定義されていないことです。次のようにグローバル変数を参照する必要があります。

$GLOBALS[$name]  // bad

または、関数の先頭にこれを追加します。

global ${$name};  // worse

警告: これはひどいです。しないでください:-)前に述べたように配列を渡すことをお勧めします。

于 2012-01-03T22:33:17.127 に答える