2012-01-03 2 views
0

다른 날 나는이 거대한 배열 집합을 얻었고 HTML 페이지를 묶음으로 만들거나/라디오 버튼을 선택한다고 말하면서 단순한 몇 가지 간단한 함수를 작성했습니다.간단한 PHP 함수에서 변수 변수 사용하기

이것은 매우 큰 HTML 선택을 생성하는 제 함수입니다. 나도 그것을 기대처럼 ${$name} 단순히/어떤 작업을 호출하지 않기 때문에

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; 
} 

이 작동하지 않습니다. 나는 이미 배열을 전달하는 곳에서 함수 호출을 처리하지만이 코드에서 가변 변수를 잘못 처리했다는 사실을 알고있다.

편집 : 일부 컨텍스트를 제공하기 위해 joomla보기에로드되어 설정을 입력하기위한 거대한 UI를 빌드합니다. 이 함수는 lib 파일에 있으며 require_once을 사용하여 내가 사용하는 모든 배열을 포함하는 다른 파일을로드합니다. 데이터베이스에는 이러한 설정의 현재 값만 포함되며 배열에는 다양한 셀렉트/라디오/드롭 다운 메뉴에 사용할 수있는 모든 옵션이 포함되어 있으며 언어/번역을 위해 별도의 파일로 중앙 집중화되어 있습니다.

사람들이 묻는 질문을 명확히하기 위해 $name에는 사용 된 배열의 이름과 HTML 선택/라디오/체크 박스 입력의 이름이 포함되어 있습니다. $evalThis은 데이터베이스에 현재있는 값이 들어있는 배열입니다.

+0

$ name의 데이터가 어떤 모습인지 예를 들려 줄 수 있습니까? – FlipMcF

+1

나는 '$ evalThis'는 무엇을할까요? 그것은 다소 '악'이라고 들린다. – PeeHaa

+0

이것을 사용해보십시오 :'$ evalThis = new stdClass(); –

답변

1

$ name에 저장된 이름이이 함수가 아니라 전역 컨텍스트에 정의 된 것처럼 보입니다.

일반적으로 함수/배열의 변수 이름을 사용하는 것이 바람직하지 않지만/적어도 합당한 경우에는 사용하지 않는 것이 좋습니다. 내가 당신이라면 난 그냥 typying의 중복처럼 보일 수

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

echo genSelect($someArr, 'someArr'); 

에 방법을 다시 것이다, 그러나 당신의 방법은 전역 범위에 의존하지하는 것이 좋습니다. Btw, $ eval이 var는 기능 범위를 벗어났습니다.

+2

[PHP DOM] (http://php.net/manual/en/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 

경고 :이 끔찍한입니다. 그것을하지 마십시오 :-) 나는 당신이 전에 언급 한 것처럼 간단하게 배열을 전달하는 것이 좋습니다.

+0

첫 번째 대답은 누가 제대로했는지 (적어도 글로벌 부분에 관한 것임). 그래도 대답을 확인하지 못했습니다 :) – PeeHaa

+2

전역 변수를 사용하는 것이 선택된 솔루션이라면, 전역 변수 $$ {$ name}을 먼저 정의하는 대신 직접'$ GLOBALS [$ name]'을 사용할 수 있습니다. – Bart

+0

@ 바트 : 너는 옳은 사람이야. 이를 반영하도록 내 대답을 수정하겠습니다. 고맙습니다. – FtDRbwLXw6