PHP에서 동적 변수 이름에 중괄호 사용


191

동적 변수 이름을 사용하려고합니다 (실제로 이름이 무엇인지 잘 모르겠습니다). 그러나 다음과 같이 거의 같습니다.

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

반환은 null작동하지 않는다는 것을 나타냅니다. 내가 찾고있는 구문이나 기술이 무엇인지 알지 못하므로 연구하기가 어렵습니다. $filelist이전에 정의되었습니다.


22
하지마 ! 그것들을 사용해야 할 좋은 이유는 없습니다. 그들은 사실상 어수선한 배열입니다. 대신 적절한 배열을 사용하십시오.
Quentin

죄송합니다. 방금 돌아가서 지금까지 한 질문에 대한 답변을 선택했습니다. 좋은 점은 단지 7 : P
user1159454

2
그리고 Quentin, 왜 나쁜 연습입니까? 그들이 생각할 배열과 함께 존재하는 이유가 있어야합니다.
user1159454

@ user1159454 — 사용 가능한 배열에 적용 할 수있는 모든 도구가없는 체계적인 혼란입니다. 그것들은 고대의 유산과 미친 경우에 존재합니다.
Quentin

8
누군가가이 질문을하기를 원하는 이유는 미쳤을 수도 있습니다.
빈센트

답변:


512

그들을 포장 {}:

${"file" . $i} = file($filelist[$i]);

작업 예


사용 ${}은 동적 변수를 만드는 간단한 방법입니다.

${'a' . 'b'} = 'hello there';
echo $ab; // hello there

4
동일한 논리로 동적 배열을 만들 수도 있습니까?
dtakis

나는 @dtakis에 대해 똑같은 의심을 가지고 있습니다. 우리를 도울 수 있습니까? 가능하면 이 질문을 살펴보십시오 .
Marcio Mazzucato

변수를 포함하기 위해 이것을 사용하는 경우 경고를 보내십시오 (가장 유용한 방법 IMHO)는 큰 따옴표를 사용하는 것을 잊지 마십시오. ${'fixedTime$i'} = $row['timeInstance'];당신은 매우 유용하지 제공 $fixedTime$i하는 대신 $fixedTime1, $fixedTime2등 (다행히도 거의 바로 그것을 발견했다.)
BeNice

82

개요

PHP에서는 $변수 앞에 변수를 추가 하여 동적 변수로 만들 수 있습니다.

$$variableName = $value;

권장하지는 않지만이 동작을 연결할 수도 있습니다.

$$$$$$$$DoNotTryThisAtHomeKids = $value;

당신은 $variableName사이 에 넣을 수는 없습니다 {}.

${$variableName} = $value;

사용은 {}당신의 변수의 이름과 같이 그 자체가 여러 값의 구성입니다 경우에만 필수입니다 :

${$variableNamePart1 . $variableNamePart2} = $value;

그럼에도 불구하고 {}더 읽기 쉽기 때문에 항상 사용하는 것이 좋습니다 .

PHP5와 PHP7의 차이점

항상 사용하는 또 다른 이유 {}는 PHP5와 PHP7이 동적 변수를 처리하는 방법이 약간 다르기 때문에 경우에 따라 결과가 달라지기 때문입니다.

PHP7에서는 동적 변수, 속성 및 메소드가 PHP5의 특수한 경우와는 반대로 왼쪽에서 오른쪽 순서로 엄격하게 평가됩니다. 아래 예는 평가 순서가 어떻게 변경되었는지 보여줍니다.

사례 1 : $$foo['bar']['baz']

  • PHP5 인터페 테이션 : ${$foo['bar']['baz']}
  • PHP7 인터페 테이션 : ${$foo}['bar']['baz']

사례 2 : $foo->$bar['baz']

  • PHP5 인터페 테이션 : $foo->{$bar['baz']}
  • PHP7 인터페 테이션 : $foo->{$bar}['baz']

사례 3 : $foo->$bar['baz']()

  • PHP5 인터페 테이션 : $foo->{$bar['baz']}()
  • PHP7 인터페 테이션 : $foo->{$bar}['baz']()

사례 4 : Foo::$bar['baz']()

  • PHP5 인터페 테이션 : Foo::{$bar['baz']}()
  • PHP7 인터페 테이션 : Foo::{$bar}['baz']()

6
모호한 주제에 대한 좋은 답변. 그런 코드를 디버깅 할 필요가 없다는 것이 정말로 기쁩니다.
martinstoeckli

4
그냥 판단하지 않고 질문에 대답하기 때문에 최고의 답변
Rid Iculous

2
예, 레거시 코드에도 문제가있었습니다. 프로덕션은 PHP5.5, 개발 환경은 PHP7입니다. 나는이 질문을 좋아한다.
Ogier Schelvis


5

쿼리에서 반환 된 결과에 대해이 작업을 자주 수행합니다.

예 :

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

이제 $ MyQueryResult [ 'MyFieldname'] 대신 $ MyFieldname (에코 문 등에서 더 쉬움)을 사용할 수 있습니다.

네, 아마도 게으른 일이지만 아무런 문제가 없었습니다.


14
PHP의 extract () 함수를 사용해 본 적이 있습니까? php.net/manual/en/function.extract.php
DarkSide

1
DB 결과 세트를위한 편리한 한 줄짜리 : foreach ($ row as $ k => $ v) {$$ k = $ v}
Rid Iculous

2

Tom 기존 배열이 있으면 해당 배열을 객체로 변환하여 다음과 같이 사용할 수 있습니다.

$r = (object) $MyQueryResult;
echo $r->key;

0

동적으로 생성 된 변수 값에 대한 솔루션이 있으며 변수의 모든 값을 결합했습니다.

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}

0

나는 6 개의 동일한 배열이있는 위치에 있었고 다른 변수에 따라 올바른 것을 선택하고 값을 할당해야했습니다. 여기에 표시된 경우 $ comp_cat은 'a'이므로 'a'배열을 선택해야했습니다 (물론 'b'~ 'f'배열도 있음)

배열에서 변수의 위치 값은 닫는 중괄호 뒤에옵니다.

$ { 'comp_cat _'. $ comp_cat .'_ arr '} [1] [0] = "FRED 블로그";

$ { 'comp_cat _'. $ comp_cat .'_ arr '} [1] [1] = $ file_tidy;

echo '첫 번째 배열 값은'. $ comp_cat_a_arr [1] [0]입니다. ' 두 번째 값은 $ comp_cat_a_arr [1] [1]입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.