2012-01-03 19 views
0

先日私はこの巨大な配列セットを与えられ、束を持つHTMLページを作ったり、ラジオボタンを選択したりして、単純化するための単純な関数をいくつか書きました。単純なPHP関数で変数変数を使う

これは、非常に大きな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の選択/ラジオ/チェックボックス入力の名前が含まれています。 $evalThisは、データベースが現在持っている値を含む配列です。

+0

あなたは$ nameのデータがどのようなものかの例を挙げることができますか? – FlipMcF

+1

私はちょうど質問しなければなりません: '$ evalThis'は何をしますか?それはちょっと「悪」と聞こえる。 – PeeHaa

+0

これを試してください: '$ evalThis = new stdClass(); –

答えて

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 

一般的にはそれが必要/少なくとも正当化されないときの関数/配列の変数名を使用するためには非常に悪いデザインです。私があなただったら、私はちょうどそれはtypyingの重複のように見えるかもしれません

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

echo genSelect($someArr, 'someArr'); 

にメソッドを書き換えるだろうが、あなたの方法は、グローバルスコープに依存していない方が良いでしょう。 Btw、$ evalこのvarも機能範囲外です。

+2

[PHP DOM](http://php.net/manual/en/book.dom.php)を使用してください。[PHP DOM](http://php.net/manual/ja/book.dom.php) )PHPでHTMLを作成するためのものです! – noob

+0

これは愚かな質問なら私には許してください。私はまだPHPを初めて学んでいます。 すべての配列を含むファイルをロードした 'require_once'が、この関数を含むファイルをロードする' require_once'の真上の、現在の場所から関数内に移動された場合、 '$ {$ name} ? – Spunkie

+0

どのコードを参照しているのか分かりませんが、関数内から 'require_once'を実行すると、インクルードされたファイルの 'global'スコープを持つものはすべて関数スコープになります。関数内からインクルードすることは推奨されません。代わりに関数を組み込み、必要に応じて呼び出すことができます。 'require_once'(または' include_once')は、別のスコープであっても同じファイルが既に含まれている場合、何もしません。 –

1

問題は、${$name}が関数のスコープ内で定義されていないことです。

$GLOBALS[$name] // bad 

するか、関数の先頭でこれを追加します:あなたはこのようにグローバル変数を参照するか必要があるだろう

global ${$name}; // worse 

WARNING:これは恐ろしいです。それをしないでください:-)私は前に述べたように単に配列を渡すことをお勧めします。

+0

最初に答えを得た人(少なくともグローバル部分について)。あなたの答えを確認していません:) – PeeHaa

+2

グローバルを使用するのが選択された解決策であれば、 '$ {$ name}'をグローバルに最初に定義するのではなく、 '$ GLOBALS [$ name]'を直接使用することもできます。 – Bart

+0

@Bart:あなたは間違いなしです。私はこれを反映するために私の答えを変更します。ありがとうございました。 – FtDRbwLXw6