Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] problem logiczny i zapytanie do bazy
Forum PHP.pl > Forum > PHP
k0b3
Mam pewien problem. Jeśli był już poruszany na forum to przeprasza - po prostu ciężko jest takie coś wyszukać. Mianowicie:

Mam tabele w bazie SQL o nagłówkach: id;a;b;

niekiedy argumenty w a powtarzają się. Może to wyglądać następująco.

Chciałbym aby móc odczytać sobie za pomocą phpa w następujący sposób

Text1
  • xxx
  • yyy
  • uuu
Text2
  • zzz
  • vvv
qpanas
Samo zapytanie SQL wyglądałoby tak:
  1. SELECT a, b FROM nazwa_twojej_tabeli ORDER BY a, b
k0b3
i co dalej? mam pobrać sobie dane za pomocą
  1. <?php
  2. ?>


cos nie wychodzi...
qpanas
Całość mogłaby wyglądać tak...
  1. <?php
  2. $_query = mysql_query('SELECT a, b FROM NazwaTwojejTabeli ORDER BY a, b');
  3.  
  4. while ($_result = mysql_fetch_assoc($_query)) {
  5. echo('<ul><li>'.$_result['a']);
  6. echo('<ul><li>'.$_result['b'].'</li></ul>');
  7. echo('</li></ul>');
  8. }
  9. ?>
...gdyby nie jeden problem - w ten sposób wyświetlisz wszystkie pozycje z kolumn 'a' i 'b' tabeli.
Cytat
  • punkt 1
    • tekst 1
  • punkt 1
    • tekst 2
  • punkt 1
    • tekst 3
  • punkt 2
    • tekst 1
  • punkt 2
    • tekst 2
  • punkt 2
    • tekst 3
Teraz trzeba stworzyć jakiś warunek w instrukcji if, który, po umieszczeniu całości w pętli while, pomijałby powtarzające się pozycje z kolumny 'a'. Muszę to jeszcze przemyśleć, ale już nie dzisiaj i nie o tej porze.
sowiq
Pora najlepsza na takie rzeczy smile.gif

  1. <?php
  2. $query = mysql_query('SELECT a, b FROM NazwaTwojejTabeli');
  3.  
  4. $tmp = Array();
  5.  
  6. while($result = mysql_fetch_assoc($query)){
  7.  
  8. if(!isset($tmp[ $result['a'] ]))
  9. $tmp[ $result['a'] ] = Array( $result['b'] );
  10.  
  11. else
  12. $tmp[ $result['a'] ][] = $result['b'];
  13. }
  14.  
  15. print_r($tmp);
  16. ?>



Otrzymasz dwuwymiarową tablicę posortowaną jak chcialeś, z którą możesz robić co chcesz smile.gif
be2k
a najprosciej chyba tak:

  1. <?php
  2. $sql = "SELECT a,b FROM _test1 ORDER BY a";
  3. $res = mysql_query($sql);
  4.  
  5. $arr = array();
  6. while($row = mysql_fetch_array($res))
  7. {
  8. $arr[$row['a']] = array_merge($arr[$row['a']], $row['b']);
  9. }
  10. ?>


i otrzymujesz taka tablice:
  1. <?php
  2. (
  3. [Text1] => Array
  4. (
  5. [0] => xxx
  6. [1] => yyy
  7. [2] => uuu
  8. )
  9.  
  10. [Text2] => Array
  11. (
  12. [0] => zzz
  13. [1] => vvv
  14. )
  15.  
  16. )
  17. ?>
k0b3
OK! Dzięki wielkie za odpowiedzi! o to mi chodzilo, ale...
Nie powiedziałem z początku, bo myślałem że pominięcie tego faktu nie będzie w jakimś tam sposób technicznie przeszkadzało w odczytaniu danych z bazy msql.

Sprawa wygląda tak, że: Pobieram sobie te dane i generuje je do pliku XML...
przedstawiony przez was sposób na pewno da się dostosować do moich potrzeb, ale nie znam się za bardzo na tablicach;
zależy mi aby to:
Kod
<?php
Array
(
    [Text1] => Array
        (
            [0] => xxx
            [1] => yyy
            [2] => uuu
        )

    [Text2] => Array
        (
            [0] => zzz
            [1] => vvv
        )

)
?>


było możliwe do zapisania XML w takiej postaci:
Kod
<?xml version="1.0" encoding="UTF-8"?>
<Text1>

<element>
<id>0</id>
<text>xxx</text>
</element>

...

<element>
<id>2</id>
<text>uuu</text>
</element>
</Text1>

</Text2>

...

<element>
<id>1</id>
<text>vvv</text>
</element>
</Text2>


Aby zapisywać używałem funkcji np w takiej postaci:
Kod
$temp ="?xml version=\"1.0\" encoding=\"UTF-8\"?";
$temp='<'.$temp.'>
<Text1>';
$plik=fopen('plik.xml','w');
fwrite($plik,$temp);
sowiq
  1. <?php
  2. // $tab <- dwuwymiarowa tablica
  3. $r = "";
  4. foreach($tab as $id => $val){
  5.  foreach($val as $tmp){
  6. $r .= "<elem>\n";
  7. $r .= "<id>".$id."</id>\n";
  8. $r .= "<text>".$tmp."</text>\n";
  9. $r .= "</elem>\n";
  10.  }
  11. }
  12.  
  13. echo $r;
  14. ?>


Ja bym to zrobił tak.
k0b3
bardzo mi pomogłeś. $r .= $id; wyrzuciłem przed drugą funkcję foreach, dzięki temu mam taki schemat jaki chciałem.
  1. <?php
  2. // $tab <- dwuwymiarowa tablica
  3. $r = "";
  4. foreach($tab as $id => $val){
  5. $r .= "<id>".$id."</id>\n";
  6.  foreach($val as $tmp){
  7. $r .= "<elem>\n";
  8.  
  9. $r .= "<text>".$tmp."</text>\n";
  10. $r .= "</elem>\n";
  11.  }
  12. }
  13.  
  14. echo $r;
  15. ?>

nie jestem pewien czy tak miało wyjść, ale to $id jest tym: Text1 i Text2, a nie numerem wiersza w tabeli array.
jak pobrać numer, aby było tak jak tu:
  1. <?php
  2. (
  3. [Text1] => Array
  4. (
  5. [0] => xxx
  6. [1] => yyy
  7. [2] => uuu
  8. )
  9.  
  10. [Text2] => Array
  11. (
  12. [0] => zzz
  13. [1] => vvv
  14. )
  15.  
  16. )
  17. ?>

...czyli nalicza od początku:
Text1 -> 0,1,2; Text2 -> 0,1

Czekam na dalszą pomoc, a za to już dziękuje! Nie wpadł bym na to za chiny! tongue.gif


///////////////////////////////////////////////////////////////////////////////////

znalazłem sposób:

  1. <?php
  2. // $tab <- dwuwymiarowa tablica
  3. $r = "";
  4. foreach($tab as $id => $val){
  5.  $i=-1;  
  6. $r .= "<id>".$id."</id>\n";
  7.  foreach($val as $tmp){
  8.  $i++;
  9. $r .= $i;
  10.  
  11. $r .= "<elem>\n";
  12.  
  13. $r .= "<text>".$tmp."</text>\n";
  14. $r .= "</elem>\n";
  15.  }
  16. }
  17.  
  18. echo $r;
  19. ?>


$i = -1, wtedy nalicza od zera. Czy to jest poprawne, czy trzeba jakoś inaczej to zrobic?
sowiq
Poprzez analogię:

  1. <?php
  2. foreach($tab as $id => $val){
  3.  foreach($val as $tmp){
  4. ?>


Zamień na:

  1. <?php
  2. foreach($tab as $id => $val){
  3.  foreach($val as $id2 => $tmp){
  4. ?>

Wtedy $id2 będzie kolejnym id tablicy w każdej iteracji.

BTW, jakoś nie pasuje mi konstrukcja XML'a typu:
Kod
<id>1</id>
<elem>
  <text>tresc</text>
</elem>
<elem>
  <text>tresc2</text>
</elem>

Trochę się to mija z ideą tego 'języka'.
k0b3
Cytat
BTW, jakoś nie pasuje mi konstrukcja XML'a typu:


wiem, wiem, ale XML wykorzystuje tu do komunikacji z flashem za pomocą Action Script. Niezwykle dobry i dynamiczny sposób na przekazanie informacji do flasha. Z koleji skrypty phpa służą mi do obróbki tych XMLów. Dane zawarte w nich pochodzą z bazy mysql.

Niestety taka forma zapisu pliku xml jest (chyba) jedynie możliwa, aby w action script kod przeszedł przez wszystkie 'kontrolki'

Pozdrawiam i jeszcze raz bardzo dziekuje wszystkim za pomoc smile.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.