2011-06-18 14 views
12
<?php 
function ReturnArray() { 
    return array('a' => 'f', 'b' => 'g', 'c' => 'h', 'd' => 'i', 'e' => 'j'); 
} 

echo ${!${!1}=ReturnArray()}['a']; // 'f' 
?> 

Proszę wyjaśnić, jaka jest logika i krok obliczeniowy z tymi {! 1} w powyższej rozdzielczości, która działa dobrze.Wyjaśnij dla mnie ten fragment PHP: zwracając tablicę i od razu odwołuj się do indeksu

+10

Laureat nagrody ezoterycznej PHP idzie do ... – Dan

+1

Co odpowiedzi wydają się być brak jest, że jest to obejście dla faktu, że 'function() [subscript]' jest faktycznie (i chciałbym, żebym to robił) a * błąd składni * w PHP. –

Odpowiedz

6

Zacznijmy od kilku podstawowych rzeczy. W PHP coś takiego jak hello będzie oceniać na ciąg "hello". Aby odwołać się do zmiennej, można użyć następującej składni: ${expr}. Istnieje również skrót do tego, $foo, który z grubsza oceni to: ${"foo"}.

Ponadto prawdopodobnie wiesz, że możesz przypisać wiele zmiennych naraz: $a=$b=$c='hello';, na przykład. To przydzieli $a, $b i $c do 'hello'. Jest to faktycznie reprezentowane jako $a=($b=($c='hello')));. $foo=value to wyrażenie, które po ustawieniu $foo ustali na value.

Wyciągu kod wygląda następująco:

echo ${!${!1}=ReturnArray()}['a']; 

Pierwszą rzeczą, tak, oczywiście, to zadzwonić ReturnArray. Następnie oblicza wartość !1, która jest wartością false. Dlatego ${!1} tworzy zmienną o nazwie false, ale nie jest łańcuchem (?!). Następnie stosuje do tablicy nie operację. Wszystkie niepuste tablice są zgodne z prawdą, więc nie operacja zmienia ją na false. Następnie ponownie używa tej składni ${}, aby pobrać zmienną o nazwie false. Następnie używa dostępu do tablicy, aby pobrać wartość w tablicy dla klucza 'a'.

Mam nadzieję, że to ma sens.

+0

Moja odpowiedź jest poprawniejsza, nazwa zmiennej nie jest "false", ale NULL (nie jak ciąg znaków, jako wartość NULL) :) –

+0

@OZ_: Może to być 'NULL', ale może również być odwołane przez' false' . – icktoofay

0

Tymczasem ja się odpowiedzi, więc po to tutaj:

echo ${!${!1}=ReturnArray()}['a']; 

${!${!1}=ReturnArray()}['a'] 
!1 resolves to false. 

${!${false}=ReturnArray()}['a'] 
false resolves to... I don't know. Let's just say false resolves to a variable "a". 

${!$a=ReturnArray()}['a'] 
$a is now the array. The ! changes the returned array into the boolean false (like: if (!$handle = fopen('x', 'r')) { echo 'connection failed' }. 

${false}['a'] 
I don't know what false resolves to, but we're using again variable "a". 

$a['a'] // this is trivial 
1

${!1} ocenia się ${false}
!${false = ReturnArray()} ocenia się $true = array('a' => 'f', /* etc */).
echo $true['a'] produkuje 'f' jak 'f' odpowiada indeksu 'a'

teraz jestem ciekaw, co to jest z?

+0

Nie mamy tego klawisza w tablicy. A $ {0} nie daje nam żadnego identyfikatora. –

+0

Przepraszam, poprawne. Ale '$ {! 1} = 'foo'' uzupełniony' print_r (get_defined_vars()) 'powoduje' '[] => foo' na dole zrzutu. Er go, to jest "fałszywy" identyfikator? – Dan

+1

Zawsze używaj 'var_dump()'; 'print_r()' nie może poprawnie wyświetlić wartości logicznej. –

0

IMHO, to w większości czysty hałas. Kod przypisuje tablicę do zmiennej, a następnie pobiera klucz a, który jest oczywiście f. Po prostu używam bajtów do generowania nazw zmiennych pośrednich i pozwalam PHP przesyłać je do ciągów.

2
  1. !1 = fałszywe
  2. ${!1} = NULL
  3. ${!1} = ReturnArray() = tablica ('a' => 'f', 'b' => 'G', 'C' => 'h', " d '=>' i ',' e '=>' j ')
  4. więc teraz $ NULL zawiera tablicę
    i ponownie widzimy konstrukcję ${!(condition), co oznacza $ NULL (patrz pierwszy i drugi punkt), dzięki czemu możemy konwertować to:
  5. $NULL['a'] (i $ NULL zawiera tablicę)

Można łatwo sprawdzić:
print_r(${NULL}); - zobaczysz tablicę;)

Powiązane problemy