PHP fa-szerkezet
Üdv mindenkinek!
Adott a következő tömbszerkezet:Ez alapján szeretnék valahogy egy mysql adatbázisba fa-szerkezetes formában egy menüt eltárolni ahol a következő a struktúra.
Erre van számtalan példa a neten, de nem az Én problémámra adnak megoldást.
Vagy Ul-Li kódot hoz létre, vagy adatbázisba illeszt, Én viszont az elején akadok el, a tömbön való végigmászással, a parent_id meghatározásával.
Amit találtam eddig, ott mindegyikben meg volt adva a parent_id.
Nos, ez a problémám, a parent_id-t nem tudom, hogy számoljam ki a tömbön mászkálva.
A továbbiakkal nincs gond, kézzel létrehozott tömbön végigmegyek és táblába is szúrom, de ezen az alaptömbön végigmenni és a parent_id-t megadni, valahogy nem megy.
Ehhez kérnék segítséget...
Előre is köszönöm!
■ Adott a következő tömbszerkezet:
$prods = array("Főkategória"=>
array(
"url"=>"fokategoria",
"sub"=>array(
"Gyártó"=>array(
"url"=>"gyarto",
"sub"=>array(
"Termékcsalád"=>array(
"url"=>"termekcsalad"
)
)
)
)
)
);
category_id | parent_id | title | url
1 | 0 | Főkategória | fokategoria
2 | 1 | Gyártó | gyarto
3 | 2 | Család | csalad
1 | 0 | Főkategória | fokategoria
2 | 1 | Gyártó | gyarto
3 | 2 | Család | csalad
Erre van számtalan példa a neten, de nem az Én problémámra adnak megoldást.
Vagy Ul-Li kódot hoz létre, vagy adatbázisba illeszt, Én viszont az elején akadok el, a tömbön való végigmászással, a parent_id meghatározásával.
Amit találtam eddig, ott mindegyikben meg volt adva a parent_id.
Nos, ez a problémám, a parent_id-t nem tudom, hogy számoljam ki a tömbön mászkálva.
A továbbiakkal nincs gond, kézzel létrehozott tömbön végigmegyek és táblába is szúrom, de ezen az alaptömbön végigmenni és a parent_id-t megadni, valahogy nem megy.
Ehhez kérnék segítséget...
Előre is köszönöm!
rekurzió
Ami meghívja saját magát, ha van 'sub' kulccsal eleme az aktuális elemnek.
Így át tudod adni a szülőt is.
Vigyázni kell, hogy ne kerülhessen túl nagy mélységű ciklusba.
Ha jól emlékszem, Poetro-nak van fent ilyesmi cikke. Próbáld meg, ha nem megy, segítünk.
Rosszul emlékszel. Poetronak
Poetronak nincs ilyesmi cikke. Egy nagyon jó SitePoint-os cikket fordított és az jelent itt meg a weblaboron. A fordírtás és az eredeti cikk sem ad választ arra a kérdésre, amit feltett a kérdező.
sorry
Viszont abban nagyon egyetértünk, hogy ilyen és hasonló fa-problémáknál érdemes végigolvasni.
A kérdést így nem lehet megválaszolni.
Lehet azt, hogy elmented az összes adatot az adatbázisba, így megkapod azok azonosítóját(category_id), majd még egyszer végigmész az elemeken és beállítod a kapcsolódó azonosítókat (parent_id).
Lehet azt is, hogy úgy mész végig a fán, hogy amikor egy elemet elmentesz, a szülő elem már el volt mentve, így tudod az azonosítóját. Az egyik lehetséges bejárás a Pepita által javasolt rekurzív bejárás, mely a legegyszerűbben implementálható, de nagyon sok erőforrást ehet. De ezen ne aggódj, kizárt, hogy olyan mélységű lenne a menü, hogy azt ne tudd feldolgozni. (Ezt abból gondolom, hogy eleve már a memóriában van)
Van egyéb bejárási módszer is, de nem akkora az adathalmaz, hogy ezzel kelljen most foglalkoznod, bár ha fejlődni akarsz, akkor érdemes azokkal is eljátszanod.
A másik kérdés, hogy hogyan tárold az adatbázisban az adatokat.
Az általad mutatott tárolási módszer az egyik legegyszerűbb, aminek a hátránya, hogy pl. morzsamenüt (útvonal egy adott levélig) nehéz generálni vele, meg részfákat se olyan egyszerű előállítani egy darab sql lekérdezéssel. A Pepita által említett cikkben ezt a kérdést járják körbe, szerintem érdemes elolvasnod.
pp
Gondom a kulcs
Köszönöm a válaszokat, amiket írtatok mind kipróbáltam...
Ha egy rekurzív tömbön kell végigjárni, aminek kulcsai számok, értékük pedig a cím/url-ből álló tömb, valamint maga az alkategória, rendben lenne a dolog.
Ami megakaszt, hogy itt a kategória címe a tömb kulcsa.
Hogy részletesebb legyek...
Egy xlsx fájlt kell feldolgozni, amiben laponként vannak a gyártók.
A termékcsaládok és a kategóriák pedig egy-egy oszlopban.
Először pedig ugyebár a lapokon tudok végigmenni (legalábbis a SimpleXLSX-et használva), de a menü struktúrájában a kategória a legfelső szint, alatta a gyártók, ez alatt pedig a családok.
Sajnos az xlsx-en nem lehet módosítani...
A táblázat felépítése:
0 | kateg1 | csalad1 | krémes
1 | kateg1 | csalad1 | kávé
2 | kateg1 | csalad2 | üdítő
3 | kateg2 | csalad1 | pogácsa
4 | kateg2 | csalad2 | kifli
----------------
gyártó1 | gyártó2 | gyártó3
Lehet rossz oldalról közelítem meg a dolgot, de a jelenlegi állás szerint:
- végigmegyek a lapokon
- végigmegyek a sorokon
Soronként:
- Létrehozok egy tömböt, kulcsa a kategória, megadom az url értékét.
Rekurzívan terveztem végigmenni rajta, megadva a parent_id-t, de nem tudom hogy számoljak... stb.
Ezen felül próbálkoztam a következővel is.
0=>array() {
'title'=>'Kategória',
'url'=>'kategoria',
'parent_id'=> 0,
'sub'=>array() {
0=>array() {
'title'=>'Gyártó',
'url'=>'gyarto',
'parent_id'=> 1,
'sub'=>array() {
0=>array() {
'title'=>'Család',
'url'=>'csalad',
'parent_id'=> 2
}
}
}
}
}
}
Mit javasoltok?
Előre is köszönöm...
Minek építed fel a memóriában
Végigmész a lapokon, ami ugye úgy néz ki, hogy végigmész a sorokon, és minden sorra a következőt teszed:
1. Lekérdezed a kategória adatait az adatbázisból, ha nincs akkor létrehozod.
2. Lekérdezed a gyártó adatait az adatbázisból, ha nincs akkor létrehozod.
3. Lekérdezed a család adatait az adatbázisból, ha nincs akkor létrehozod. (ha ez nem unique akkor a gyártót is át kell adni a lekérdezésnek, nem csak a nevét)
4. Elmented a terméket az adatbázisba, a megfelelő család (gyártó, kategória) adatokkal együtt.
Import done.
pp
Rendben is lenne, de...
De itt annyi a probléma, hogy elég sok adatról van szó ami kb. 25 lapot, laponként 20 - 1.000 sort jelent.
Az általad leírtakat mind-mind soronként végigvinni túl sokáig tartana.
... vagy félreértettem valamit. :)
És gondolnom kell a jövőre is, ennél csak több adat lesz.
Amiatt gondoltam tömbökre, mert hamarabb tudom ellenőrizni azt, hogy létezik-e a rekord, avagy sem, gondolok itt a kulcsokra.
Az általad írt módszer és a tömbök közt ahogy Én gondolom van futásidő beli különbség... ami esetemben sokat számít.
Persze nem elvetendő ötlet, sok adat van, ami a gondot okozza, az az ismétlődés a sorokban...
A másik ami miatt szükségem van a tömbökre, az, hogy az url-eket php függvénnyel formázom meg.
nem egy megoldás a problémádra..
RecursiveArrayIterator class
Megvolt, az akadás oka ugyanaz...
A parent_id-t nem tudom a kulcsok felhasználtságával azokból szerezni, egyébként pedig nem tudom hogy-s-mint tudnám kiszámolni, hol kell ++-olni... :D
Legalább próbáld meg. :)
"Az általad leírtakat mind-mind soronként végigvinni túl sokáig tartana."
Az adatbázis azonosítót, csak azután kapod meg, miután elmentetted. Hogyan lehetne gyorsabban? Egyébként ha egy kategóriát egyszer beolvastál/létrehoztál, tarthatod a memóriában, attól a fenti megoldás még működni fog.
Ennek mi köze az importhoz?
Úgy érzem teljesen rossz fele indultál el. Az első, hogy beimportálod az excelt az adatbázisba(ami akár egy var_export is lehet egy fájlban) és után foglalkozol a megjelenítéssel, de ekkor az xls-t már el lehet felejteni.
pp
pontosan
probald ki amiket irt.
Jogos...
A megjelenítés majd ez után, bár az elmélet már megvan rá, de előbb legyen valami az adatbázisban. :)
Adott az excel táblázat.
Azt tömbként tudom csak feldolgozni, SimpleXLSX használatával...
De most az excelben található adatokat szeretném valahogy a szülő-gyermek kapcsolatok megállapításával az adatbázisba írni.
A fenti kóddal a szülő-gyermek kapcsolatok megvannak.
Az okoz gondot, hogy ami alapján a végigjáráskor be tudnám azonosítani a szülő-tömböt, az szöveg, nem pedig szám.
A fentebb létrejövő tömbön szeretnék valahogy úgy végigjárni-kelni, hogy közben tudom számolni a kategóriákat, a gyártók parent_id-jének megadni, s így tovább, közben mindegyik elemnek megadni a címét és az url-jét.
A feldolgozásához valahogy így kezdenék neki: (elméletben)
Előre is köszönöm és elnézést...
Még mindig nem értem mi okoz
"Az okoz gondot, hogy ami alapján a végigjáráskor be tudnám azonosítani a szülő-tömböt, az szöveg, nem pedig szám."
Nem az a kérdés, hogy szám-e vagy sem, hanem, hogy egyedi-e, vagyis egyértelműen azonosítja-e az adott elemet, avagy sem. Ha a név ilyen akkor tökéletes erre.
Még mindig nem értem, hogy minek építed fel a tömböt, amin nem tudsz végigiterálni.
pp