Używanie nawiasów klamrowych z dynamicznymi nazwami zmiennych w PHP


191

Próbuję użyć nazw zmiennych dynamicznych (nie jestem pewien, jak się faktycznie nazywają), ale w zasadzie tak:

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

var_dump($file0);

Zwrot nullmówi mi, że to nie działa. Nie mam pojęcia, jaka jest składnia lub technika, której szukam, co utrudnia badanie. $filelistjest zdefiniowany wcześniej.


22
Nie ! Nigdy nie ma dobrego powodu, aby z nich korzystać. W rzeczywistości są po prostu nieporządną tablicą. Zamiast tego użyj odpowiedniej tablicy.
Quentin,

W porządku, przepraszam, właśnie wróciłem i wybrałem odpowiedź na każde zadane dotąd pytanie. Dobrze, że to tylko 7: P
1159454

2
A Quentin, dlaczego oni są złymi praktykami? Musi istnieć powód, dla którego istnieją obok tablic, jak sądzę
1159454

@ user1159454 - Są to niezorganizowany bałagan bez wszystkich narzędzi, które można zastosować do dostępnych macierzy. Istnieją one ze starożytnych powodów spuścizny i szalonych przypadków krawędzi.
Quentin

8
Przypadki szalonych krawędzi mogą być dokładnie tym, dlaczego ktoś chciałby zadać to pytanie.
Vincent,

Odpowiedzi:


511

Zawiń je w {}:

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

Przykład roboczy


Używanie ${}jest sposobem na tworzenie zmiennych dynamicznych, prosty przykład:

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

4
Czy można również tworzyć dynamiczne tablice o tej samej logice?
dtakis

Mam takie same wątpliwości co do @dtakis, czy możesz nam pomóc? Jeśli to możliwe, spójrz na to pytanie .
Marcio Mazzucato,

Ostrzegaj, jeśli używasz tego do dołączenia zmiennej (najbardziej użyteczny sposób IMHO), nie zapomnij użyć podwójnych cudzysłowów. ${'fixedTime$i'} = $row['timeInstance'];daje niezbyt przydatne $fixedTime$izamiast $fixedTime1, $fixedTime2itp. (Na szczęście zauważyłem to prawie od razu.)
BeNice

81

Przegląd

W PHP możesz po prostu wstawić dodatkowy $przed zmienną, aby stała się zmienną dynamiczną:

$$variableName = $value;

Chociaż nie poleciłbym tego, możesz nawet połączyć to zachowanie:

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

Możesz, ale nie musisz stawiać $variableNamemiędzy {}:

${$variableName} = $value;

Używanie {}jest obowiązkowe tylko wtedy, gdy sama nazwa zmiennej jest złożona z wielu wartości, takich jak:

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

Niemniej jednak zaleca się zawsze używać {}, ponieważ jest bardziej czytelny.

Różnice między PHP5 a PHP7

Innym powodem, dla którego należy zawsze używać {}, jest to, że PHP5 i PHP7 mają nieco inny sposób radzenia sobie ze zmiennymi dynamicznymi, co w niektórych przypadkach skutkuje innym wynikiem.

W PHP7 zmienne dynamiczne, właściwości i metody będą teraz oceniane ściśle w kolejności od lewej do prawej, w przeciwieństwie do mieszanki specjalnych przypadków w PHP5. Poniższe przykłady pokazują, jak zmieniła się kolejność oceny.

Przypadek 1 : $$foo['bar']['baz']

  • Interpretacja PHP5: ${$foo['bar']['baz']}
  • Interpretacja PHP7: ${$foo}['bar']['baz']

Przypadek 2: $foo->$bar['baz']

  • Interpretacja PHP5: $foo->{$bar['baz']}
  • Interpretacja PHP7: $foo->{$bar}['baz']

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

  • Interpretacja PHP5: $foo->{$bar['baz']}()
  • Interpretacja PHP7: $foo->{$bar}['baz']()

Przypadek 4: Foo::$bar['baz']()

  • Interpretacja PHP5: Foo::{$bar['baz']}()
  • Interpretacja PHP7: Foo::{$bar}['baz']()

6
Dobra odpowiedź na wątpliwy temat. Cieszę się, że nie muszę debugować takiego kodu.
martinstoeckli

4
najlepsza odpowiedź, ponieważ tylko odpowiada na pytanie bez osądzania
Rid Iculous

2
Tak, mieliśmy też pewne problemy ze starszym kodem. Produkcja była PHP 5.5, środowisko deweloperskie PHP7. Popieram to pytanie.
Ogier Schelvis


5

Robię to dość często na podstawie wyników zwróconych z zapytania.

na przykład

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

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

Teraz mogę po prostu użyć $ MyFieldname (co jest łatwiejsze w instrukcjach echa itp.) Zamiast $ MyQueryResult [„MyFieldname”]

Tak, to chyba leniwe, ale nigdy nie miałem żadnych problemów.


14
Czy próbowałeś kiedyś użyć funkcji extract () w PHP? php.net/manual/en/function.extract.php
DarkSide,

1
poręczna jednowierszowa dla zestawów wyników DB: foreach ($ row as $ k => $ v) {$$ k = $ v}
Rid Iculous

2

Tom, jeśli masz już tablicę, możesz przekonwertować tę tablicę na obiekt i użyć jej w następujący sposób:

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

0

Mam rozwiązanie dla dynamicznie tworzonej wartości zmiennej i połączyłem całą wartość w zmiennej.

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

0

Byłem w pozycji, w której miałem 6 identycznych tablic i musiałem wybrać właściwą w zależności od innej zmiennej, a następnie przypisać jej wartości. W pokazanym tutaj przypadku $ comp_cat był „a”, więc musiałem wybrać moją tablicę „a” (ja oczywiście miałem również tablice „b” do „f”)

Zauważ, że wartości pozycji zmiennej w tablicy idą za nawiasem zamykającym.

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

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

echo „Pierwsza wartość tablicy to”. $ comp_cat_a_arr [1] [0]. ' a druga wartość to. $ comp_cat_a_arr [1] [1];


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.