php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.09.2004, 12:24  
Gast
 
Beiträge: n/a
Standard Komme nicht sorecht weiter / Kategorie Baum erstellen.

Hallo Leute,
ich bin grade daran einen KategorienBaum aufzubauen.
Er soll mal später in einem Select Feld erscheinen so aussehen:
Hauptkategorie:Unterkategorie.

Ich habe eine Tabelle cat wo ich folgende Sachen habe:
id -> auto increament id
parentid ->vater der categorie
name -> name der categorie
level -> level der categorie

nun zeigt der mir immer nur das an was in der letzen schleife geniert wird. ist es eigentlich möglich eine funktion mit dem gleichen namen wieder in einer funktion aufzurufen oder muss man das anders machen.

also das script ist noch total der humbug. also kaum zu gebrauchen und am besten nicht soviel dran halten

also der soll nachjeder aufgerufenen kategorie nachgucken ob unterkategorien da sind und die anzeigen bzw dann darstellen. von der unterkategorie soll dann wieder geguckt werden ob noch unterkategorien enthalten sind. das soll aber alles so dynamisch entstehen.

naja könnt ihr mir mal ne paar denk anstoesse oder sowas geben. weil damit komme ich im moment nicht ueber den berg ;(

cat 1 und cat 2 sind kategorien des 1 grades und werden vorher ausgewählt.

dann sollen auf der neuen seite wieder neue erstellt werden.

ich stelle mir das so vor wie bei ebay. erst 1 hauptkategorie wählen dann die unterkategorie.

also bei ebay dann verkaufen klicken und dann nach der kategorien eingabe möchte ich das genau so gestalten. das wäre dann der 3 schritt.

leute, die dazu nix produktives sagen koennen , können ihren kommentar bitte lassen.

vielleicht ne bisschen kurios ausgedrückt, nachfragen koennt ihr aber trotzdem gerne.

mfg

emu
PHP-Code:
<?php
$cat1 
$_REQUEST['cat1'];
$cat2 $_REQUEST['cat2'];

function 
catselect($parentid,$level)
{
    
$connect mysql_pconnect("xxx","xxx""xxx"); 
    
$database  mysql_select_db("xxx",$connect); # das sollte klar sein wir rufen unsere db an. 

    
$sql_cat "SELECT * FROM ` cat` WHERE parentid = '$parentid' AND level = '$level'";
    
$query_catmysql_query($sql_cat,$connect) OR die(mysql_error());
    
$row mysql_fetch_row($query_cat);
    print(
"
\n"
);
    print(
$row['2']);
    
$parentid ++;
    if(
mysql_num_rows($query_cat) > 0)
    {
    
catselect($parentid,$level);
    }
    else
    {
    
$level +1;
    }
}

// Verbindung aufbauen
$connect mysql_pconnect("xxx","xxx""xxx"); 
$database  mysql_select_db("xxx",$connect); # das sollte klar sein wir rufen unsere db an. 

// Unterkategorien auslesen
$sql_select "SELECT * FROM `cat` WHERE parentid = '$cat1' OR parentid = '$cat2'";
$sql_select_query mysql_query($sql_select,$connect);
print(
mysql_error());


while(
$row mysql_fetch_row($sql_select_query))
{
    print(
$row['2']);
    
$parentid $row['0'];
    
$level $row['3'] + 1;
    
catselect($parentid,$level);
}
?>
[/php]
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.09.2004, 23:24  
Gast
 
Beiträge: n/a
Standard kleiner Denkanstoß *g*

hallo hallo...
wenn ich dich richtig verstehe willst du x-beliebig viele unterkategorien erstellen... dein gedankenansatz, dass sich eine funktion selbser aufruft ist an dieser stelle absolut richtig...

du bräuchtest eine funktion die folgenden ablauf realisiert:
- Hole alle Unterelemente aus der DB für $element_id
- Wenn was gefunden wird, das Ergebnis in einer Schleife durchlaufen und die Funktion selbst für das Unterelement wieder aufrufen.
- Wenn nichts gefunden wird false zurückliefern

Code:
<?php
function getElements($element_id)
{
$result = "";
$res=mysql_query("SELECT * FROM table WHERE parent_id='$element_id'");
if (mysql_num_rows($res)==0) return false;
else
{
while ($row=mysql_fetch_assoc($res))
{
$result.="<option value=\"".$res["id"]."\">".$res["name"]."</option>\n";
$subresult=getElements($res["id"]);
if ($subresult!=false) $result .= $subresult;
}
return $result;
}
}
?>
<h2>Unterelemente vom Element Nr. <?php $element_id ?></h2>
<select>
<?php echo getElements($element_id); ?>
</select>
So müsste das ungefähr funktionieren. Nach und nach baut sich so ein String zusammen mit in diesem Fall generierten <option>-Feldern - kannst es auch in nem array abspeichern.

Hoffe ich konnte dir nen Denkanstoß geben, ist auf jeden Fall ein interessantes Problem

greetz
andy
 
Alt 27.04.2005, 17:48  
Gast
 
Beiträge: n/a
Standard

Hallo.
Habe die Suchfunktion benutzt, deswegen die Antwort ein wenig spät

Also, ich bin auch gerade das Concept für einen Onlineshop am aufbauen. Dort brauche ich auch beliebig viele Kategorien/Unterkategorien.

Habe den gedanken mit der rekursiven funktion verstanden und die funktion nachvollzogen. alles ok.

eine frage jedoch :
tut ihr alles ein eine tabelle?

ich hatte erst vor, für jede Ebene eine Tabelle erstellen zu lassen.
also eine für "hauptkategorie(autos,motorräder,boote)". "1.unterkategorieebene(pkw,lkw/...)", "2.unterkategorieebene(audi,bmw../MAN..)"
 
Alt 27.04.2005, 18:33  
Erfahrener Benutzer
 
Registriert seit: 29.10.2004
Beiträge: 1.781
derHund
Standard

Zitat:
für jede Ebene eine Tabelle erstellen zu lassen.
haha. sehr witzig.

es kommt natürlich auf deine daten an, aber generell: ja.
__________________
derHund ist offline  
Alt 27.04.2005, 18:41  
Gast
 
Beiträge: n/a
Standard

hallo...
besser eine späte antwort als nie

also prinzipiell würde ich alle kategorien in eine tabelle schreiben und mit einem feld "cat_owner" auf die entsprechend übergeordnete Kategorie verweisen. deine artikel verweisen dann mit einem foreign-key auf die zugehörige kategorie.

jedoch ist mein oben geposteter algorithmus bei wirklich großen kategorie-beständen nicht der perfomanteste. grund dafür ist, dass für jeden datensatz ein select an die datenbank geschickt wird (um zu prüfen ob er unterelemente hat).

am elegantesten wäre es nur ein select query auf die datenbank zu schicken und alles in einem array abzulegen. aus diesem array kann man dann mit einem rekursiven algorithmus ebenfalls einen baum ermitteln und spart sich damit einiges an datenbankquerys.

nur mal so als gedanke zu der problematik

sei gegrüßt
andy
 
Alt 27.04.2005, 21:54  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

die performante lösung, um bäume mit mysql abzubilden, heißt nested sets. rekursion ist zwar schön, aber quatsch weil nur bei kleinen datenmengen performant genug. nested sets haben einen relativ geringen aufwand und kommen mit wenig queries zurecht.
dazu gibt's bereits vorgefertigte packages, wie z.b.
http://pear.php.net/package/DB_NestedSet

die theorie dahinter habe ich selbst auch nur zu 80% geschnallt - das ganze ist einfach zu genial ... um das ganze aber zu benutzen, solltest du dich trotzdem wenigstens grob in die theorie einlesen, dabei hilft dir google mit den suchbegriffen php + nested + sets.

bleibt halt nur noch die frage: warum _noch ein_ weiterer php-webshop?
axo ist offline  
Alt 27.04.2005, 22:19  
Gast
 
Beiträge: n/a
Standard

hey axo...
danke für den link... werd ich mal nachlesen - aber beim ersten drüberschauen sieht es aus, als passiert genau das was ich in meinem letzten posting angesprochen hab - blos abstrahiert auf mehrere datenbanken und ausgabemöglichkeiten. aber korrigier mich bitte, wenn ich mich irre...

desweiteren denke ich muss die klasse auf einem rekursivem algorithmus basieren, um einen baum zusammenzubauen - wie sollte das sonst von statten gehen ?

gruß andy
 
Alt 28.04.2005, 12:09  
Gast
 
Beiträge: n/a
Standard

Warum noch ein webshop?
nun ja, weil ich immer ALLES selbst code. will kein geld für arbeit die ich mir garnicht gemacht habe... weiß nicht ob das einer versteht?!

außerdem ist dann nur das drin was der kunde möchte ?
 
Alt 28.04.2005, 18:24  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Runsky
nun ja, weil ich immer ALLES selbst code. will kein geld für arbeit die ich mir garnicht gemacht habe... weiß nicht ob das einer versteht?!
hast meine volle zustimmung - jedoch lohnt es sich ggf. mal über den eigenen tellerrand hinauszuschauen...

gruß
andy
 
Alt 04.05.2005, 18:47  
Gast
 
Beiträge: n/a
Standard

ich hoffe es interessiert noch jemanden.
habe das ganze mal bisschen abgeändert ( die ausgabefunktion muss ich noch machen)

PHP-Code:
<?php
$sql 
"SELECT
                                  id,
                                  parent_id,
                                  cat_name
                         FROM
                                  cat"
;
    
$result mysql_query($sql) OR die(mysql_error());
    
    
$daten = array();
    
    while ( 
$row mysql_fetch_assoc$result ) )
    {
        
        
$daten[$row['id']]['cat_name'] = $row['cat_name'];
        
$daten[$row['id']]['parent_id'] = $row['parent_id'];
        
    }
    

    function 
get_parent_ids($data$id)
    {
      if (
$id == NULL//no parents, because 0 is root level
    
{    //return empty array
        
return array();
    }    
    
//return the parents id and the parent ids of the parent, merged to one array
    
return array_merge(
            array(
$data[$id]['parent_id']),
            
get_parent_ids($data$data[$id]['parent_id'])
            );
  }
    
    function 
cat_tree($daten,$parent_id NULL)
    {
        
$links = array();
        foreach(
$daten as $id => $value )
        {
            if (
$value['parent_id'] == $parent_id)
            {      
                
$links[$id]['cat_name'] = $value['cat_name'];
                
$links $linkscat_tree($daten,$id);
            }
        }
        return 
$links;
    } 
?>
werde jez noch eine funktion basteln, die aufgrund der parent - ids, das menü ausklappen kann,
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Turnierbaum aus array erstellen kingflo PHP-Fortgeschrittene 11 30.07.2008 11:32
Großer Baum -> Große Datei -> Hohe Ladezeit :( PsychoEagle PHP Tipps 2008 7 22.09.2007 12:44
Tabelle in phpmyadmin erstellen und in Dreamweaver 8 einfüge PHP Tipps 2006 21 07.03.2006 21:35
darf keine Datenbank erstellen in phpMyAdmin Datenbanken 2 20.10.2005 19:32
[Erledigt] FAQ erstellen, kleines Problem mit Kategorien PHP Tipps 2005-2 1 09.09.2005 14:09
xml baum erstellen PHP Tipps 2005-2 1 11.08.2005 10:32
Dateien erstellen und chmod setzen auch wenns nicht geht ^^ PHP Tipps 2005 8 22.05.2005 02:53
Stammbaum erstellen Riot PHP Tipps 2005 17 13.05.2005 16:32
einfache Kategoriestruktur und deren Zuordnung... PHP Tipps 2005 1 20.04.2005 12:24
Ordner erstellen und Datei uploaden Juuro PHP Tipps 2005 6 20.01.2005 21:18
elektr. Fragebögen erstellen Beitragsarchiv 4 27.10.2004 12:57
2* gleiches newssystem auf server (kategorie fehler ?) PHP Tipps 2004 1 24.10.2004 18:46
Problem bei Script Formular Daten und Baum PHP Tipps 2004 1 27.09.2004 23:19
Witze Off-Topic Diskussionen 7 09.07.2004 20:51
Ordner per Skript erstellen --> Rechte Problem PHP Tipps 2004 2 06.07.2004 14:19

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
kategoriebaum erstellen, http://www.php.de/php-tipps-2005/8268-komme-nicht-sorecht-weiter-kategorie-baum-erstellen.html, spielbaum erstellen, ebay kategoriebaum, rekursiv baum erstellen php, baum aufbauen array php, baumstruktur php erstellen, baum rekursiv aufbauen, kategoriebaum ebay, php kategoriebaum, kategorienbaum erstellen, php tree aufbauen mit id parent_id, baum erstellen php, tree aufbauen php, www.xxxconnect.de, algorithmen erstellen baum aus tabelle, php baum durchlaufen, php algorithmus id parentid, kategoriebaum ebay projekt, rekursiv erstellen baum

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:06 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.