This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

Ten pomysł “wisiał” na mojej liście rezerwowej przez dosyć długi czas, czekając na dobrą okazję do podjęcia tematu. Ze względu na to, że zwykle dzielę się z Wami rozwiązaniami napotkanych przeze mnie błędów / problemów, stwierdziłem, że czas na “coś nowego” - coś, co przynajmniej raz na jakiś czas przełamie schemat. Dzisiejszy wpis będzie więc całkowicie poświęcony pewnej ciekawej funkcjonalności, która może dość istotnie ułatwić obsługę skryptów.

Wstęp.

Buszując po bezkresach Internetu staram się zaobserwować możliwie jak najwięcej sposobów wykonania stron, zarówno od strony wizualnej [frontend - szablony], jak i tej bardziej “serwerowej” [backend - oczywiście na tyle, na ile się da]. Takie mam niestety [a może i stety?] zboczenie zawodowe, zresztą nie wydaje mi się niczym dziwnym podglądanie pomysłów potencjalnej konkurencji, w końcu człowiek, a w szczególności programista, uczy się całe życie - jest to chyba jedna z niewielu profesji w której przysłowiowe “spoczęcie na laurach” to śmierć zawodowa. ;]

Z wielu takich obserwacji powstają wpisy na niniejszym blogu, ponieważ to głównie wiedza i pomysły innych inspirują do “dłubania” w kodzie i poznawania coraz to nowszych sposobów na zadziwienie klientów i zaciekawienie Czytelników. Gdyby tak przyszło samemu wymyślić te wszystkie problemy, a szczególnie rozwiązania dla nich, to podejrzewam, że wszystkie blogi o programowaniu można by streścić w kilkudziesięciostronicowym czasopiśmie wydawanym raz do roku. ;]

Pomysł, o którym chciałbym Wam dzisiaj powiedzieć to efekt krótkiego zastanowienia się nad linkami przekazywanymi w jednym ze sklepów internetowych, gdzie wszystkie parametry GET posiadały dziwnie podobne końcówki rażąco podobne do kodu przypisania kolejnego elementu tablicy w PHP. Zapraszam do lektury.

Parametry żądania GET.

Zapewne nie raz zdarzyło Wam się [szczególnie na początku zabawy z PHP, przed poznaniem możliwości rozszerzenia mod_rewrite serwera Apache] przekazywać parametry do skryptu PHP w następujący sposób:
http://localhost.com/index.php?param=value&foo=bar
Uprzedzam - nie ma w tym nic złego, po prostu tak się to "zazwyczaj" robi, kwestia upodobań własnych / klienta [wtedy to już jednak trudno nazwać upodobaniami ;]]. Ot, nic ciekawego, dostajemy dwa parametry i ich wartości w tablicy $_GET:
1
2
3
4
array(
  'param' => 'value',
  'foo' => 'bar',
)

można by rzec - standard. Jeśli tych parametrów pojawi się kilka, kilkanaście, a nawet kilkadziesiąt - także nie będzie to nic specjalnego, najwyżej wprowadzimy jakieś prefiksy lub inny sposób organizacji ich wartości w sensowne grupy. Oczywiście im więcej tych elementów, tym bardziej będziemy mieli “problem”, ale twórcy stron internetowych jakoś sobie z tym radzą i nie narzekają, także można zacytować jedną ze standardowych odpowiedzi - “da się? da się!”.

Otóż, może i się da - powstaje jednak pytanie - po co się męczyć? O ile łatwiejsze byłoby nasze życie w przypadku, w którym wewnętrzne mechanizmy języka same pogrupowałyby parametry według ustalonych przez nas reguł. Da się?

Przekazywanie tablic.

Proste, że się da - nie widzę innej możliwości. ;] Oczywiście nie osiągniemy tutaj jakiejś niewyobrażalnie wielkiej magii, aczkolwiek przyznam, że mnie na samym początku powaliła na ziemię... prostota tego rozwiązania. ;]

Zanim przejdę do opisu samego pomysłu chciałbym tylko nadmienić, że ten pomysł najprawdopodobniej jest też możliwy do realizacji w innych językach programowania, aczkolwiek będziecie musieli poszukać dodatkowych informacji na ten temat w Internecie. Ja chciałbym wskazać samą ideę i przykładową implementację w PHP - tutaj mogę się wypowiadać rzeczowo, dlatego będę wdzięczny za wszelkie Wasze komentarze na temat tej funkcjonalności w znanych Wam technologiach.

Ok, wiem, lubię sobie popisać, dlatego teraz będę konkretny do granic możliwości. Rozwiązanie prosto z mostu między oczy. ;] Wyobraźcie sobie adres URL o poniższej strukturze:

http://localhost.com/index.php?param[]=value1&param[]=value2&param[]=value3
ze smutnym wzrokiem spoglądacie pewnie w myślach na wydruk wywołania funkcji var_dump($_GET)... [żeby móc użyć kolorowania składni użyłem var_export(), także proszę mi tu nie zarzucać braku wiedzy ;]]:
1
2
3
array (
 'param[]' => 'value3',
)

Dlatego pragnę Was niniejszym “nieco” zdziwić i zaproponować nieco inny, bardziej poprawny wydruk:

1
2
3
4
5
6
7
8
array (
  'param' => 
  array (
    0 => 'value1',
    1 => 'value2',
    2 => 'value3',
  ),
)

Co sądzicie o tym? Fajne? A to dopiero początek. ;] W ten sposób możemy przekazać także kilka tablic:

http://localhost.com/index.php?param[]=value1&param[]=value2&foo[]=bar1&foo[]=bar2
da nam to następujące dane wejściowe:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
array (
  'param' => 
  array (
    0 => 'value1',
    1 => 'value2',
  ),
  'foo' => 
  array (
    0 => 'bar1',
    1 => 'bar2',
  ),
)

Jako “deser” i przysłowiową “wisienkę na torcie” powiem Wam, że przekazywane elementy tablicy wcale nie muszą być takie anonimowe [numerowane], możemy też przekazywać tablice asocjacyjne:

http://localhost.com/index.php?param[bar1]=value1&param[bar2]=value2
i wydruk:
1
2
3
4
5
6
7
array (
  'param' => 
  array (
    'bar1' => 'value1',
    'bar2' => 'value2',
  ),
)

Myślę, że w tym momencie mogę śmiało powiedzieć, że widzę uśmiechy na Waszych ustach i ten charakterystyczny “błysk w oku” oznaczający jedno - “Panowie i Panie, zapraszam do klawiatur!”, a więc dłubanie i rozciąganie pomysłu we wszystkie strony, szukając jak najbardziej ciekawego sposobu wykorzystania tego, co mieliście okazję przeczytać powyżej. Być może uśmiech jest nieco mniejszy w przypadku osób, które już znają ten “trik”, ale proszę Was, pozwólcie się pocieszyć innym. ;]

Temat jest dosyć szeroki, dlatego za tydzień w kolejnym wpisie pokażę Wam jak jeszcze można wykorzystać ten pomysł w innych miejscach stron internetowych - mam nadzieję, że chętnie usiądziecie przed monitorami, żeby posłuchać, co mam do powiedzenia. Polecam także dorzucić tą zakładkę do ulubionych - za tydzień pojawi się tu link do kolejnych materiałów z serii.

Podsumowanie.

Pisząc zwykle o różnych błędach i ich rozwiązaniach niejako przyzwyczaiłem [zarówno Was, jak i samego siebie] do typowego układu wpisów na moim blogu - Wstęp, Problem, Rozwiązanie, Podsumowanie... i tak w kółko. Mam nadzieję, że nie macie mi tego za złe, ale jeśli uważacie, że trzeba w tej materii coś zmienić, jestem otwarty na wszelkie propozycje. Nasz Czytelnik - nasz Pan! Do zobaczenia w niedzielę na kolejnym Linkdumpie! ;]

PS Tak jak wspominałem nieco wyżej, tradycyjnie będę wdzięczny za wszelkie komentarze - Wasz głos jest dla mnie najcenniejszym skarbem skrupulatnie przechowywanym w bazie danych. ;]