문제

배열이나 중첩 된 객체를 가리키는 가변 변수를 만들 수 있습니까? PHP 문서는 구체적으로 슈퍼 글로벌을 가리킬 수 없지만 이것이 일반적으로 배열에 적용되는 경우 (적어도 나에게) 불분명하다고 말합니다.

다음은 배열 var var에서의 시도입니다.

     // Array Example
     $arrayTest = array('value0', 'value1');
     ${arrayVarTest} = 'arrayTest[1]';
     // This returns the correct 'value1'
     echo $arrayTest[1];
     // This returns null
     echo ${$arrayVarTest};   

다음은 객체 var var로 내가 의미하는 바를 보여주는 간단한 코드입니다.

     ${OBJVarVar} = 'classObj->obj'; 
     // This should return the values of $classObj->obj but it will return null  
     var_dump(${$OBJVarVar});    

여기서 명백한 것을 놓치고 있습니까?

도움이 되었습니까?

해결책

배열 요소 접근:

  • 문자열에서 배열 이름을 추출하고 저장하십시오. $arrayName.
  • 문자열에서 배열 인덱스를 추출하고 저장하십시오. $arrayIndex.
  • 전체가 아닌 올바르게 구문 분석하십시오.

코드:

$arrayTest  = array('value0', 'value1');
$variableArrayElement = 'arrayTest[1]';
$arrayName  = substr($variableArrayElement,0,strpos($variableArrayElement,'['));
$arrayIndex = preg_replace('/[^\d\s]/', '',$variableArrayElement);

// This returns the correct 'value1'
echo ${$arrayName}[$arrayIndex];

객체 속성 접근:

  • 구분 기자 (->)에 의해 액세스하려는 클래스와 속성을 포함하는 문자열을 폭발시킵니다.
  • 이 두 변수를 할당하십시오 $class 그리고 $property.
  • 전체가 아닌 개별적으로 구문 분석하십시오 var_dump()

코드:

$variableObjectProperty = "classObj->obj";
list($class,$property)  = explode("->",$variableObjectProperty);

// This now return the values of $classObj->obj
var_dump(${$class}->{$property});    

효과가있다!

다른 팁

사용 = & 참조로 할당하려면 :

 $arrayTest = array('value0', 'value1');
 $arrayVarTest = &$arrayTest[1];

 $arrayTest[1] = 'newvalue1'; // to test if it's really passed by reference

 print $arrayVarTest;

~ 안에 echo $arrayTest[1]; VARS 이름은입니다 $arrayTest 배열 인덱스와 함께 1, 그렇지 않습니다 $arrayTest[1]. 괄호는 PHP "키워드"입니다. 메소드 표기법과 동일합니다 -> 운영자. 따라서 분할해야합니다.

// bla[1]
$arr = 'bla';
$idx = 1;
echo $arr[$idx];

// foo->bar
$obj = 'foo';
$method = 'bar';
echo $obj->$method;

당신이하고 싶은 것은 PHP 코드를 평가하는 것과 비슷합니다 (eval()). 그러나 기억하십시오 : 평가는 악합니다. ;-)

당신은 그렇게 할 수 없습니다. 변수, 객체 및 함수 이름으로 만 할 수 있습니다.

예시:

 $objvar = 'classObj';
 var_dump(${$OBJVarVar}->var);

대안은 Eval () 또는 사전 프로세싱을 통해 이루어질 수 있습니다.

$arrayTest = array('value0', 'value1');
$arrayVarTest = 'arrayTest[1]';

echo eval('return $'.$arrayVarTest.';');
eval('echo $'.$arrayVarTest.';');

그것은 당신이 입력이 무엇인지 확신한다면입니다.

사전 처리로 :

function varvar($str){
  if(strpos($str,'->') !== false){
    $parts = explode('->',$str);
    global ${$parts[0]};
    return $parts[0]->$parts[1];
  }elseif(strpos($str,'[') !== false && strpos($str,']') !== false){
    $parts = explode('[',$str);
    global ${$parts[0]};
    $parts[1] = substr($parts[1],0,strlen($parts[1])-1);
    return ${$parts[0]}[$parts[1]];
  }else{
    return false;
  }
}

$arrayTest = array('value0', 'value1');
$test = 'arrayTest[1]';
echo varvar($test);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top