2012-01-03 3 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} просто не вызывает ничего/работу, как я надеюсь, тоже. У меня уже есть работа вокруг, где я просто передаю массив, хотя вызов функции, но он исказил меня, что я делал неправильно с переменными переменными в этом коде.

Редактировать: Чтобы дать некоторый контекст, это загружается в представлении joomla для создания гигантского пользовательского интерфейса для ввода параметров. Эта функция находится в файле lib и загружается с require_once рядом с другим файлом, содержащим все используемые мной массивы. База данных содержит только текущие значения этих параметров, а массивы содержат все возможные варианты для различных меню выбора/радио/выпадающего меню и централизованы в отдельном файле по причинам языка/перевода.

Уточнение некоторых вопросов, заданных людьми, $name просто содержит имя используемого массива, а также имя входа/выбора HTML/флажка. $evalThis - это массив, содержащий значения, имеющиеся в базе данных.

+0

Вы можете привести пример того, как выглядят данные в $ name? – FlipMcF

+1

Я просто должен спросить: что делает '$ evalThis'? Это звучит как «злой». – PeeHaa

+0

Попробуйте следующее: '$ evalThis = new stdClass(); $ evalThis-> loaded_settings = array ('abc' => array ('value' => 1)); ' –

ответ

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'); 

Это может показаться дублированием typying, но это лучше, чтобы не иметь ваши методы зависят от глобального масштаба. Btw, ваш $ evalThis var также выходит за пределы области действия.

+2

Используйте [PHP DOM] (http://php.net/manual/en/book.dom.php) для создания HTML с PHP! – noob

+0

Простите меня, если это глупый вопрос, я все еще новичок в PHP. Будет ли это означать '$ {$ name}' будет работать, если 'require_once', который загрузил файл, содержащий все массивы, был перемещен внутри функции из текущего местоположения, непосредственно над' require_once', который загружает файл, содержащий эту функцию ? – Spunkie

+0

Я не уверен, в каком коде вы ссылаетесь, но если вы выполняете 'require_once' внутри функции, то все, что имеет глобальную область в включенном файле, будет в области функций. Не рекомендуется включать из функции; вместо этого включают функции и вызывают их при необходимости. Также обратите внимание, что 'require_once' (или' include_once') ничего не сделает, если тот же файл уже был включен ранее, даже в другой области. –

1

Проблема в том, что ${$name} не определен внутри области действия. Вы должны были бы либо ссылки на глобальную переменную так:

$GLOBALS[$name] // bad 

Или добавьте это в верхней части функции:

global ${$name}; // worse 

ВНИМАНИЕ: Это ужасно. Не делайте этого :-) Я советую просто передать массив, как вы упомянули ранее.

+0

Первый ответ, который получает это право (по крайней мере, о глобальной части). не подтвердили ваш ответ, хотя :) – PeeHaa

+2

Если использовать глобальные переменные - это выбранное решение (можно было бы надеяться, что нет), вы также можете использовать '$ GLOBALS [$ name]' непосредственно вместо определения '$ {$ name}' global first. – Bart

+0

@Bart: Вы абсолютно правы. Я изменю свой ответ, чтобы отразить это. Спасибо. – FtDRbwLXw6

Смежные вопросы