배열 또는 중첩 된 객체를 가리키는 가변 변수
-
19-09-2019 - |
문제
배열이나 중첩 된 객체를 가리키는 가변 변수를 만들 수 있습니까? 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);
제휴하지 않습니다 StackOverflow