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.

użytkownik1159454
źródło
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
Sarfraz
źródło
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']()
John Slegers
źródło
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
20

Spróbuj użyć {}zamiast ():

${"file".$i} = file($filelist[$i]);
Joakim Johansson
źródło
1
z podręcznika phpNET php.net/manual/ru/language.variables.variable.php $price_for_monday = 10; $price_for_tuesday = 20; $today = 'tuesday'; $price_for_today = ${ 'price_for_' . $today}; echo $price_for_today; // will return 20
Vladimir Ch
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.

Tomek
źródło
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;
corysus
źródło
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;
}
Murad
źródło
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];

M61Vulcan
źródło
0

Spróbuj użyć {} zamiast ():

${"file".$i} = file($filelist[$i]);
Vildan Bina
źródło