Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tablice wielowymiarowe - dynamicznie
Asmox
post 6.03.2009, 19:55:25
Post #1





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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....


--------------------
Go to the top of the page
+Quote Post
rzymek01
post 6.03.2009, 19:58:31
Post #2





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


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,


--------------------
:]
Go to the top of the page
+Quote Post
Mephistofeles
post 6.03.2009, 19:59:13
Post #3





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


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. ?>

?

Ten post edytował Mephistofeles 6.03.2009, 20:01:06
Go to the top of the page
+Quote Post
Asmox
post 6.03.2009, 21:25:53
Post #4





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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ę)


--------------------
Go to the top of the page
+Quote Post
Mephistofeles
post 6.03.2009, 22:21:11
Post #5





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mlattari
post 7.03.2009, 04:02:11
Post #6





Grupa: Zarejestrowani
Postów: 79
Pomógł: 3
Dołączył: 23.12.2008
Skąd: Piaseczno

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował mlattari 7.03.2009, 04:02:51
Go to the top of the page
+Quote Post
Mephistofeles
post 7.03.2009, 10:05:52
Post #7





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Spawnm
post 7.03.2009, 10:15:20
Post #8





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




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 .
Go to the top of the page
+Quote Post
rzymek01
post 7.03.2009, 10:19:35
Post #9





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


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?


--------------------
:]
Go to the top of the page
+Quote Post
Mephistofeles
post 7.03.2009, 10:24:05
Post #10





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Heh, niezłe, nie wiedziałem, że kilka instrukcji można do fora wstawić smile.gif.
Go to the top of the page
+Quote Post
KCG
post 8.03.2009, 11:32:48
Post #11





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


Możesz jeszcze zrobić:
  1. <?php
  2. $tab[] = array(0 => 'zero', 1 => 'jeden');
  3. ?>


--------------------
9242594 - zaczynasz? jak mogę, to pomogę :D /podstawowa znajomość php :P /
"to pomoc zawsze będzie gestem pięknym, zaliczana do tych teraz rzadko spotykanych..."
Go to the top of the page
+Quote Post
Mephistofeles
post 8.03.2009, 16:42:16
Post #12





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


A co to ma wspólnego z bazą?
Go to the top of the page
+Quote Post
KCG
post 8.03.2009, 19:08:44
Post #13





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


Zrozumiałem, że chcesz zrobić to bez $i:
  1. <?php
  2. $tablica[$i][0] = $wynik[2];
  3. $tablica[$i][1] = $wynik[3];
  4. ?>


--------------------
9242594 - zaczynasz? jak mogę, to pomogę :D /podstawowa znajomość php :P /
"to pomoc zawsze będzie gestem pięknym, zaliczana do tych teraz rzadko spotykanych..."
Go to the top of the page
+Quote Post
rzymek01
post 8.03.2009, 19:58:41
Post #14





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
:]
Go to the top of the page
+Quote Post
Asmox
post 9.03.2009, 21:18:41
Post #15





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


OK, dobra, chyba mój przykład najbardziej mi się podobał... Ale i tak dzięki za ciekawe propozycje biggrin.gif .


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.06.2025 - 04:37