DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   prikaz svih vesti po kategorijama (http://www.devprotalk.com/showthread.php?t=7839)

pocetnik00 03. 09. 2009. 15:30

prikaz svih vesti po kategorijama
 
imam jedan problem, i ne znam kako bih ga resio, a da to bude samo sa jednim upitom..

vesti uzimam iz baze, sa sve kategorijom u kojoj se nalaze:
Kôd:

$vesti=$db->get_results("SELECT vesti.id, vesti.title, category.name as cname FROM vesti LEFT JOIN category ON category.id=vesti.cat_id");
I sad imam array sa vestima i njihovim kategorijama:
Kôd:

Array
(
    [0] => stdClass Object
        (
            [title] => Vest1
            [id] => 1
            [cat_id] => 1
            [cname] => Kategorija1
        )

    [1] => stdClass Object
        (
            [title] => Vest2
            [id] => 2
            [cat_id] => 1
            [cname] => Kategorija1
        )

    [2] => stdClass Object
        (
            [title] => Vest3
            [id] => 3
            [cat_id] => 2
            [cname] => Kategorija2
        )
  [3] => stdClass Object
        (
            [title] => Vest4
            [id] => 3
            [cat_id] => 2
            [cname] => Kategorija2
        )

kako sad da ispisem sve vesti po kategorijama?
Znaci ovako nesto da dobijem:

Kôd:

<ul>
<li>Kategorija 1
  <ul>
  <li>Vest 1</li>
  <li>Vest 2</li>
 </ul>
</li>
<li>Kategorija 2
  <ul>
  <li>Vest 3</li>
  <li>Vest 4</li>
 </ul>
</li>
</ul>

Hvala unapred:)

eraser 03. 09. 2009. 16:09

Ne znam dal sam dobro razumeo pitanje, ali evo odgovora kako bi mogao da "odradis".
U upitu stavis da ti sortira po id_cat,
sada sledi ispis podataka,
na pocetku stavis temp_cat = stdClass[0].cat_id i krenes u petlju za sve podatke, prilikom obrade sledeceg podatka pitas da li je temp_cat == stdClass[i].cat_id,
ako jeste to znaci da je to jos jedna vest iz te kategorije,
a ako nije jednako onda znaci da je nova kategorija.
Kada predjes u novu kategoriju moras da postavis temp_cat = stdClass[i].cat_id.

dootzky 03. 09. 2009. 17:47

ili kako eraser kaze, ili to prosto uradi sa vise protrcavanja kroz bazu, nagadjam da nemas ni 100 unosa za sada? nek imas i 1000, pa opet nije puno...

1) prosto protrci i pokupi sve kategorije, sortiraj po volji
2) foreach($cat ..) $cat['news'] = get_news($id_cat); ...

right? :P

ne kazem da je preterano pametno resenje, ali je brzo i efektno (pragmatichno)

LiquidBrain 03. 09. 2009. 18:54

@dootzky
Ne vidim razlog zasto bi za svaku vest ponovo pristupao bazi? Malo ne efikasno?

bluesman 03. 09. 2009. 19:54

možeš jednim querijem ali moraš malo da promuljaš niz koji dobiješ.

PHP kôd:

// $data je tvoje niz koji dobiješ iz baze
$kategorije = array();
foreach (
$data as $row)
{
    if (!isset(
$kategorije[$row['cat_id']]))
    {
        
$kategorije[$row['cat_id']] = array();
    }

    
$kategorije[$row['cat_id']] [] = $row;


dobices bas tako kako su napravio tvoje ugnjezdene liste

$kategorije = array
(
[1] => array (vest 1, vest 2),
[2] => array (vest 3, vest 4),
);

pocetnik00 03. 09. 2009. 20:50

@bluesman
Probacu tako ako ne uspem na ovaj nacin sto je eraser predlozio..


Uglavnom sad uspevam nesto da uradim, ali problem je sto u petlji ne znam koji je prethodni element bio, tako da kada ispisem kategoriju, ako u njoj ima vesti onda se ne ispise prva vest, jer u tom prolazu ispisem samo naziv kategorije..

A akada ispisem i naziv vesti onda mi se brka ispis, zakomplikovao sam mnogo, vise ni sam ne znam gde gresim..

Kôd:

$temp_cat = $artikli[0]->cat_id;

$open_cat=false;
echo "<ul>\n";
echo "<li>" . $artikli[0]->cname ."\n";
foreach ($artikli as $a) {
    if ($temp_cat == $a->cat_id){ //iz iste kategorije
        if (!$open_cat) { $open_cat=true;}//otvara se kategorija
        echo "\t\t<li>$a->title</li>\n";
    } else { //nova kategorija
        if ($open_cat){ echo "\t</ul>\n"; $open_cat=false;} //zatvara se kategorija
        $temp_cat=$a->cat_id;
        echo "</li>\n"; //zatvara se prethodni li
        echo "<li>$a->cname \n";
        echo "\t<ul>\n";
        echo "<li>$a->title</li> \n";
    }
}

Znam da sam imao neku funkciju koja na osnovu niza ispisuje katgorije/vesti, znam da se koristile neke rekurzivne funkcije, ali sam zaboravio kako tacno ide..

pocetnik00 03. 09. 2009. 21:08

bluesman resenje se pokazalo nekako najlakse, ali moraju(?!) 2 upita zbog praznih kategorija..

Kôd:

$vesti=$db->get_results("SELECT vesti.id, vesti.title, category.name as cname FROM vesti LEFT JOIN category ON category.id=vesti.cat_id");

$kategorije2=$db->get_results("SELECT category.id,category.title FROM category order by category.id asc");

$kategorije = array();
foreach ($vesti as $row)
{
    if (!isset($kategorije[$row->cat_id]))
    {
        $kategorije[$row->cat_id] = array();
    }

    $kategorije[$row->cat_id][] = $row;
}



//echo "<pre>"; print_r($kategorije); echo "</pre>"; die();

echo "<ul>\n";
foreach ($kategorije2 as $cat) {
    echo "<li>$cat->title\n";
    if (!empty($kategorije[$cat->id])) {
        echo "\t<ul>\n";
        foreach ($kategorije[$cat->id] as $a){
            echo "\t\t<li>$a->title</li>\n";

        }
        echo "\t</ul>\n";
    } else {


    }
    echo "</li>\n";

}

echo "</ul>\n";

bitno je da radi, ali ako ima neki predlog kako ovo resiti sa jednim upitom, neka da ideju:)

bluesman 03. 09. 2009. 21:21

Ček, hajde kada smo već krenuli sa ovim, da isteramo do kraja :)

Vrlo važno pitanje? Da li ti hoćeš da se listaju SVE kategorije ili samo one u kojima ima vesti? Od toga zavisi sve.

Ovaj 2. query ti je nepotreban u bilo kom slučaju.

Ako ćeš da listaš SVE kategorije, čak i one koje nemaju vesti, onda je najlakše da koristiš RIGHT JOIN kategorija, tako ćeš dobiti sve. Probaj:

"SELECT vesti.id, vesti.title, category.name as cname FROM vesti RIGHT JOIN category ON category.id=vesti.cat_id"

Trebalo bi da dobiješ ovako nešto
Kôd:

  id        title        cname
  1    naslov 1        kategorija 38
  2    naslov 2        kategorija 12
  3    naslov 3        kategorija 99
 null      null          kategorija 205 koja nema vesti
 null      null          kategorija 392 koja nema vesti

Ali je onda i ono "muljanje" malo drugacije nego sto sam ti napisao.

I samo jedna napomena: mysql querije u foreach petlji izvršavaš isključivo pod pretnjom smrću. :)


Vreme je GMT +2. Trenutno vreme je 09:22.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.