Kom ihåg mig?
Home Menu

Menu


Hur lagra kategorier

 
Ämnesverktyg Visningsalternativ
Oläst 2013-07-17, 00:13 #1
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Standard Hur lagra kategorier

Hej,

Jag måste lagra ett stort antal kategorier med tillhörande parents.
Just nu ser min enda tabell ut såhär:

ID, NAME, PARENT_ID
Och de kategorier som inte har en parent får naturligtivs PARENT_ID 'NULL'

Är detta ett bra sätt att lagra datan på? Jag får det jävligt krångligt när jag ska hämta ut alla kategorier och sortera dem. Kan man göra på något annat sätt? Det ska fungera med oändligt antal parents.
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 00:14 #2
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Det är så det ska göras ja.

Det du vill göra är en rekursiv metod, som hämtar alla underkategorier.
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 00:46 #3
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Okej, men nu vill jag lista upp alla i ett "träd". Likt detta:
HTML-kod:
|__ Parent
    |__ CHILD1
    |__ CHILD2
        |__ GRANDCHILD1
        |__ GRANDCHILD2
|__ Parent1
    |__ CHILD4
    |__ CHILD5
        |__ GRANDCHILD8
        |__ GRANDCHILD23
Men det fungerar inte.

Här är mitt försök:
PHP-kod:
$main_cats $database->query("SELECT v.*, (SELECT name FROM categories c WHERE c.id= v.parent) AS ParentName FROM categories v ORDER BY v.name ASC, ParentName ASC") or die($database->error);
    
$categories = array();
    while(
$r $main_cats->fetch_array(MYSQLI_ASSOC)) {
        
$categories[] = $r;
    }
    
    
$tree = array('NULL' => array('children' => array()));
    foreach(
$categories as $item) {
        if(isset(
$tree[$item['id']])){
            
$tree[$item['id']] = array_merge($tree[$item['id']],$item);
        } else {
            
$tree[$item['id']] = $item;
        }

        
$parentid is_null($item['parent']) ? 'NULL' $item['parent'];
        if(!isset(
$tree[$parentid])) 
            
$tree[$parentid] = array('children' => array());
        
$tree[$parentid]['children'][] = &$tree[$item['id']];
    }
    
$categories $tree['NULL']['children'];
    unset(
$tree); 
Nu hamnar underkategorierna över deras förälder. Det ska det ju inte göra.
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 01:01 #4
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Som jag sa, en rekursiv metod är vad du ska använda.

PHP-kod:
//loopa alla som inte har någon parent
{
 
getcategories(id)
}
function 
getcategories(id)
{
 
spara ner dennes namn
 
//loopa alla som har 'id' som parent
 

   
getcategories(underkategori_id)
 }

yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 09:05 #5
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Jag förstår hur du tänker mig ja kan inte se hur det kan sortera sig själv.Det blir väl exakt likadant som min kod?
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 09:12 #6
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Edit: Tar bort koden jag nyss postade då jag nyss kom på att du är användaren frecka. Mod kan ta bort detta inlägg. Hänvisar till tråden http://www.wn.se/t1055558.html

Senast redigerad av yakuzaemme den 2013-07-17 klockan 09:23
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 09:58 #7
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Va?

'spara ner dennes namn'
Jag förstår inte din pseudo kod så bra
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 11:43 #8
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Ha en array, vi kan kalla den categories.
Loopa igenom alla kategorier som har parent=0, dvs. huvudkategorierna
Spara ner namnet på denna kategori i categories (categories[] = namnet)
Loopa igenom funktionen getCategories, där id är den aktiva kategoriern i loopen
I getCategorier, kör en query som hämtar alla children (dvs som har parent = id)
Loopa igenom denna query och lägg till namn + getCategorier(kategori id i loopen)
Returnerna en array

Vill inte ge dig färdig kod pga. hur du betett dig innan, utan nu blir det lite eget tänk
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 16:55 #9
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Ska prova det du sa, har aldrig riktigt förut kodat rekursivt så det blir lite nytt. Ja helst vill ja ha pseudokod eller som du nu skrev, hur man gör steg för steg. Antar att man lär sig lite bättre om hur man gör det då.

Anledningen till att ja har gjort ett annat konto är för att varje gång jag skrev något på det gamla fick jag massa skitkommentarer som var OT Hoppas på bättre lycka här nu..
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 18:25 #10
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Nu har jag lyckats att få den array jag vill ha. Här är koden:
PHP-kod:
$ordered_categories = array();
    
$i 0;
    foreach(
$categories as $k => $v) {
        
// Loop only parents and put in fresh list
        
if($v["parent"] == 0) {
            
$ordered_categories[$i] = $v;
            
$ordered_categories[$i]["children"] = getSortedCategories($v["id"], $categories);
            
$i++;
        }
    }
    
    function 
getSortedCategories($id$categories) {
        
$return = array();
        
$m 0;
        foreach(
$categories as $c) {
            if(
$c["parent"] == $id) {
                
$return[$m] = $c;
                
$return[$m]["children"] = getSortedCategories($c["id"], $categories);
            }
            
$m++;
        }
        return 
$return;
    } 
Men nu har jag problem med att få rätt identering i <select> taggen. Jag vill att varje barn hoppar in 5 &nbsp; och varje barnbarn hoppar in det dubbla(10 &nbsp. Men jag vet inte när jag ska öka $treeGrowth för att den ska identera rätt. Här är mitt försök. Denna kod identerar bara de första barnen(alltså nivå 1)
PHP-kod:
<select name="parent"><option value="0">Ingen</option>
                                <?php
                                    
                                    
function intendChildren($children) {
                                        
$treeGrowth 1;
                                        foreach(
$children as $row) {
                                            
$intend "";
                                            for(
$i=0;$i<$treeGrowth;$i++) {
                                                
$intend .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                                            }
                                            echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">'.$intend.'|__'.$row["name"].'</option>';
                                            
intendChildren($row["children"]);
                                        }
                                    }
                                
                                    foreach(
$ordered_categories as $row) {
                                        echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">|__'.$row["name"].'</option>';
                                        
intendChildren($row["children"]);
                                    }
                                
?>
                                </select>
EDIT: Bry er inte om SESSION. Den lade jag bara till för att jag är lat(den hjälper mig när jag lägger till nya underkategorier.)
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 13:45.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017