![]() |
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. |
Det är så det ska göras ja.
Det du vill göra är en rekursiv metod, som hämtar alla underkategorier. |
Okej, men nu vill jag lista upp alla i ett "träd". Likt detta:
HTML-kod:
|__ Parent Här är mitt försök: PHP-kod:
|
Som jag sa, en rekursiv metod är vad du ska använda.
PHP-kod:
|
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?
|
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
|
Va?
'spara ner dennes namn' Jag förstår inte din pseudo kod så bra |
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 |
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.. |
Nu har jag lyckats att få den array jag vill ha. Här är koden:
PHP-kod:
PHP-kod:
|
Jag löste det genom att lägga till en parameter till identeringsfunktionen. Tack för hjälp .
PHP-kod:
|
Snyggt!
Tänk på att du kan köra $return[] = array(värden här) istället för $return[x] Bra jobbat :) |
Flytta ner '{' från slutet på raden till första synliga tecken på nästa rad så det går att läsa koden. Sen tycker jag att din parameter $growth borde heta $level i stället för det är ju vad det är, en typ av "nivå" på indenteringen, eller nästningsdjupet.
Sätter du måsvingarna under varandra som jag visar i mitt exempel nedan så ser du en textuell symmetri som gör det många gånger lättare att följa flödet i strukturen än om du sätter första måsvingen i slutet på raden och den avslutande måsvingen i början av sista raden i blocket. PHP-kod:
|
Conny, att välja vart måsvingar ska sitta och hur man ska identera kod är en smaksak. Det finns inget standardsätt att skriva sånt på. Hur bra tyckte du annars jag löste uppgiften med att sortera dem? yakuza skrev på skype att man borde såhär: http://pastebin.com/DL7kkAEi
Men tar inte det längre tid att göra fler anrop till DB än att hantera en stor array i PHP? |
Posta hela din kod så vi kan se :)
|
Jag gjort det :P Eller vad mer ville du ha?
|
Citat:
Gör en komplett Console app som går att testköra så kan du få mer hjälp. Annars måste jag bygga en helt egen app bara för att testköra detta ..... Du bör ju göra Category till en klass med metoder för add(), remove(), load()/fetchall(), save(), move(), delete().... I klassen ska du ha en privat variabel som innehåller själva trädstrukturen, så det går att skapa fler instanser av klassen, om man nu vill göra det. Du bör ha en helt egen klass som innehåller databasconnection och som man kan göra ett static anrop till för att få den eventuellt öppna Connection som finns till databasen. För varje tabell du har i databasen gör du (minst) en egen klass (ibland behövs fler klasser för en tabell om man har en komplex struktur). Connectionklassen kan då återanvändas mellan alla dessa tabellklasser, Connection är troligen samma för hela databasen (undantag finns). PHP-kod:
PHP-kod:
PHP-kod:
|
Jag uppskattar att du tog dig tid att skriva det där men det kommer blir en högre laddningstid om man ska göra instanser av varje kategori. Använd gärna mysqli eller PDO och inte mysql_*** för den är typ gammal eller nåt har jag för mig. Jag förstår verkligen inte heller varje en kategori bör ha massa metoder som jag aldrig kommer använda.
|
Citat:
Men du missar hela idén med att dela upp programmet i små funktioner. Det är skitsnack att du skulle få "längre laddtider", det kanske tar 0,00001 sekunder längre tid, tror du att en användare skulle märka skillnaden? Den stora skillnaden blir när du ska utöka funktionaliteten i programmet, du får mindre buggar, för varje funktion är enkel att använda. Om du inte vill "instanciera" så kan du göra alla funktionerna static. Men din Array måste du instanciera i vilket fall för du måste lagra den i en variabel och då har du redan instansierat arrayen. Så argumentet att det sinkar programmet är inte relevant. Men det underlättar programutvecklingen enormt mycket. Du gör ju exempelvis add() redan när du laddar upp din Array idag, det är bara att du inte gjort det till en återanvändbar funktion, så om du vill lägga till en kategori så måste du lägga till den i databasen och sen ladda om hela arrayen, då tar det tid må jag säga. Eller hur har du tänkt att använda detta program? Metoderna som jag föreslog är ju bara "standardmetoder" för att lägga till, ta bort och hämta data från kategori arrayen eller från databasen, det är i princip samma metoder du har på alla tabeller i databasen, sen kan t det finnas vissa tabeller man har fler metoder för men det bygger man ut efter behov. Bygger man det objektorienterat från början så blir det enklare att utöka och ändra allteftersom man jobbar med programmet. Konsekvensen blir at programmet blir enklare att underhålla, det går snabbare att införa förändringar och det blir mindre buggar. Det är givetvis ingen garanti men det är i vart fall min och de flesta andra OO-förespråkares erfarenhet. |
Citat:
...medan ... Indent betyder "indrag"... |
Kod:
$cats = get_stuff("SELECT * FROM categories ORDER BY parent_id ASC"); |
Alla tider är GMT +2. Klockan är nu 20:54. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson