Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tablice wielowymiarowe - dynamicznie
Forum PHP.pl > Forum > PHP
Asmox
Witam,
chciałem zrobić tablice wymiarowe generowane dynamicznie przez pętlę. Wygląda ona tak:
  1. <?php
  2. function tematy_tablica() {
  3. $query = "SELECT * FROM tematy;";
  4. $make = mysql_query($query);
  5. $i = 0;
  6. while ($wynik = mysql_fetch_row($make)) {
  7. $tablica[$i][0] = $wynik[2];
  8. $tablica[$i][1] = $wynik[3];
  9. $i++;
  10. }
  11. return $tablica;
  12. }
  13. ?>

Można łatwo zobaczyć, że "pierwszy" wymiar tablicy musi być tworzony przez zmienną, która jest zwiększana po każdym kółku pętli. Musiałem tak zrobić, ponieważ:
  1. <?php
  2. $tablica[][0] = $wynik[2];
  3. $tablica[][1] = $wynik[3];
  4. ?>

Dawało błędy. Podejrzewam, że na przykład przy pierwszym zakręceniu tej pętli zmienne wyglądały w ten sposób:
  1. <?php
  2. $tablica[0][0] = $wynik[2];
  3. $tablica[1][1] = $wynik[3];
  4. ?>

Czy jest jakaś możliwość dynamicznego generowania tablic, ale bez użycia tej zmiennej $i ? Nie wiem dlaczego, ale bardzo mi się ona nie podoba. Pewnie dlatego, że zmienne z liczbą bardziej pasują do pętli for. Więc jeśli byłby sposób, żeby usunąć tą zmienną z pętli....
rzymek01
co za problem tę pętlę while przerobić na for?

inaczej nie zrobisz, bo sam zauzażyłeś, że indeks [] tworzy nowy indeks o wartości o jeden więckszej niż poprzedni,
Mephistofeles
A nie mogło by być coś takiego:
  1. <?php
  2. function tematy_tablica() {
  3. $query = "SELECT 'kolumna1', 'kolumna2' FROM tematy;";
  4. $make = mysql_query($query);
  5. while ($wynik = mysql_fetch_row($make)) {
  6. $tablica[] = $wynik
  7. }
  8. return $tablica;
  9. }
  10. ?>

?
Asmox
Cytat(rzymek01 @ 6.03.2009, 19:58:31 ) *
co za problem tę pętlę while przerobić na for?

inaczej nie zrobisz, bo sam zauzażyłeś, że indeks [] tworzy nowy indeks o wartości o jeden więckszej niż poprzedni,

Nie, muszę mieć pętlę while, ponieważ z założenia nie wiem, ile wyników zwróci mi funkcja while.

Cytat(Mephistofeles @ 6.03.2009, 19:59:13 ) *
A nie mogło by być coś takiego:
  1. <?php
  2. function tematy_tablica() {
  3. $query = &#092;"SELECT 'kolumna1', 'kolumna2' FROM tematy;\";
  4. $make = mysql_query($query);
  5. while ($wynik = mysql_fetch_row($make)) {
  6. $tablica[] = $wynik
  7. }
  8. return $tablica;
  9. }
  10. ?>

?

Nie, ponieważ potrzebna jest mi teoretycznie jedna zmienna (bo tylko jedną można zwrócić z funkcji, chyba że się mylę)
Mephistofeles
Eee, że co? Przecież w obu rozwiązaniach zwracasz tablicę. A o ile się nie mylę, to w PHP przypisanie jednej tablicy do drugiej jest równoznaczne ze stworzeniem tablicy dwuwymiarowej.
mlattari
Ja bym to rozwiązał tak....

  1. <?php
  2. /* Przypisanie wyników zapytania do tablicy $item   */
  3. $result = mysql_query ($query);
  4. $record=0;
  5. while ($row=mysql_fetch_row($result))
  6.  {
  7.   for ($c=0;$c<mysql_numfields($result);$c++)
  8.    {
  9.       $item[$record][$c]=$row[$c]; // Przypisuje dane pobrane z bazy do tablicy $item
  10.      }
  11.    $record++;
  12.   }
  13.  mysql_free_result($result); // :-)
  14. ?>
Mephistofeles
A moje rozwiązanie jest jakieś złe? Sam takie stosuję do załadowania do tablicy dwuwymiarowej XMLa z językiem i działa. Najpierw ładuję do jednej tablicy dane z jednej kategorii, a potem całą tablicę daję do drugiej tablicy, i tak aż do końca.
Spawnm
W sumie to jeśli nie kasujesz rekordów w tablicy to możesz dać $tablica[ $wynik['id'] ][1]=$wynik['cos'];
wtedy masz $i++ pobrane z bazy , a przecież i tak pobierasz wszystko smile.gif
A i taka propozycja -> jak pobierasz zamiast * wypis co chcesz pobrać, szybciej się wykona zapytanie, dodatkowo stosuj nazwy w tablicy zamiast 1,2,3
co by zrobić kod czytelniejszym .
rzymek01
mlattari, po co tyle petli?

Asmox,
a pętla for to gorsza? biggrin.gif

tak wygląda pętla nieskończona:
  1. <?php
  2. for ( ; ; );
  3. ?>


tak wygląda nieskończona pętla ale z licznikiem:
  1. <?php
  2. for ($i = 0; ; ++$i);
  3. ?>


a tak wygląda pętla w sam raz dla ciebie:
  1. <?php
  2. for ($i = 0; $wynik = mysql_fetch_row($make); ++$i)
  3. ?>


a tak wygląda twoje rozwiązanie:
  1. <?php
  2. //zapytanie sql, utowrzenie zmiennej $make
  3.  
  4. $tablica = array();
  5. for ($i = 0; $wynik = mysql_fetch_row($make); $tablica[$i] = $wynik, ++$i);
  6. ?>


interesujące?
Mephistofeles
Heh, niezłe, nie wiedziałem, że kilka instrukcji można do fora wstawić smile.gif.
KCG
Możesz jeszcze zrobić:
  1. <?php
  2. $tab[] = array(0 => 'zero', 1 => 'jeden');
  3. ?>
Mephistofeles
A co to ma wspólnego z bazą?
KCG
Zrozumiałem, że chcesz zrobić to bez $i:
  1. <?php
  2. $tablica[$i][0] = $wynik[2];
  3. $tablica[$i][1] = $wynik[3];
  4. ?>
rzymek01
problem został rozwiązany w moim powyzszym poście, jesli koniecznie bez $i to:
  1. <?php
  2. //zapytanie sql, utowrzenie zmiennej $make
  3.  
  4. $tablica = array();
  5. for ( ; $wynik = mysql_fetch_row($make); $tablica[] = $wynik);
  6. ?>
Asmox
OK, dobra, chyba mój przykład najbardziej mi się podobał... Ale i tak dzięki za ciekawe propozycje biggrin.gif .
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.