php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.02.2007, 16:18  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

ERGÄNZUNG:
das was ich da jetzt gerade fabriziert habe ist ja kompletter schwachsinn. hier bitte der richtige ansatz (so denke ich zumindest):
allerdings stehe ich hier auch an. wie sollte ich denn da weitermachen?
PHP-Code:
<?php

/* db: menue
  id, parent_id, name
  1,  0,         hauptkat1
  2,  0,         hauptkat2
  3,  1,         unterkat von hauptkat1
  4,  3,         unterkat von unterkat der hauptkat1
*/  

// hauptkategorien in array speichern
$sql "SELECT id, parent_id, name FROM menue WHERE parent_id = 0";
$query mysql_query($sql);
$root_array = array();
while(
$data mysql_fetch_assoc($query)) {
  
$root_array[] = array('id' => $data['id'],
                        
'parent_id' => $data['parent_id'],
                        
'name' => $data['name'];
}

// direkte kinder in array speichern
$sql "SELECT id, parent_id, name FROM menue WHERE parent_id = $id";
$query mysql_query($sql);
$child_array = array();
while(
$data mysql_fetch_assoc($query)) {
  
$child_array[] = array('id' => $data['id']
                         
'parent_id' => $data['parent_id'],
                         
'name' => $data['name'];
}
?>
__________________
mfg Alexander Haim
Promaetheus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 15.02.2007, 17:11  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Also erstmal ist der Code innerhalb der while() Schleife unnötig:
PHP-Code:
<?php
$root_array
[] = array('id' => $data['id'],
                        
'parent_id' => $data['parent_id'],
                        
'name' => $data['name']; 
// ist gleichbedeutend mit
$root_array[] = $data;
?>
Woher kommt $id im 2. Query?
Wue du weitermachen musst? Mit Rekursion.
Schreib dir eine Funktion, die für eine oder mehrere IDs alle Kinder ausliest.
Aus dem Ergebnis extrahierst du die ID und übergibst das Ergebnis wieder an die Funktion. Solange weitermachen, bis die Funktion keine Treffer mehr landet.

Schade dass du dich nicht an Nested Sets ranwagst. Nur weil der Name englisch ist, ist es noch kein Hexenwerk und der Artikel beschreibt doch alles, sogar wie die SQL-Statements aussehen müssen.
Zergling-new ist offline  
Alt 15.02.2007, 18:32  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

tja... ich habe mich sehr vohl mit den nested sets befasst. nicht dass denkst ich sehe mir das alles nicht an. es ist auch nicht so schwer zu verstehen und die einträge zu machen ist auch nicht so schwer. ALLERDINGS lässt sich mein problem (und ich habe lange darüber nachgedacht und gedankengänge versucht) damit meines erachtens nicht lösen, dass wenn ich eine unterunterunterkategorie habe, diese und NUR diese aufgeklappt dargestellt wird. bei den ersten kategorien funktioniert das super mit den lft´s 12345... aber was ist wenn die kategorie 3 mit unterkategorien aufzuklappen ist. wie komme ich dann zur top kategorie. (siehe kategorie [13-14])
Code:
   1-20
2-7 8-9 10-19
3-6       11-18
4-5       12-17
            13-14  15-16
ich denke dass das mit nested sets nicht möglich ist. und mit parent wäre das "einfacher" zu lösen. deshalb hatte ich das oben ja zu lösen versucht, da mir, THEORETISCH zumindest ein lösungsweg eingefallen wäre.

zu obigem problem:
eine funktion die rekursiv alle parent_menüpunkte ausliest ist mir klar. ABER wie kann ich das dann mit dem root-array kombinieren?
ich werde mich jetzt aber mal dransetzen und das so machen wie du mir gesagt hast. wie du siehst... ich bin ja nicht faul und für alles offen und möchte lernen.
bei so komplexen dingen (und vor allem rekursionen) hab ich dann aber schnell mal einen knopf im hirn )

EDIT: ich bin sehr sehr froh dass es nicht nur MIR so geht, sondern dass mehr leute das nicht checken : http://www.tutorials.de/forum/php/23...erstellen.html
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 15.02.2007, 22:37  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Promaetheus,

hier ist objektorientierte Programmierung eine recht interessante Hilfe. Ich habe das mal vor 2 Jahren so gelöst:

- mein Mapper (Datenschicht) läd in abstrahierter Form Baum-Knoten-Objekte aus der
Datenbank. Dieser hat zudem Methoden zum Speichern oder Löschen eines Knotens.
- mein Manager (Business-Schicht) kann die Baum-Knoten-Objekte verarbeiten und
Methoden des Mappers zum Laden des Baumes verwenden.

Das sieht ungefähr so aus:

Mapper:

[php]<?

class BaumMapper
{

var $__Config;
var $__SQL;


function BaumMapper($Abschnitt){

$iH = new iniHandler('config::modules::baumstruktur');
$this->__Config = $iH->zeigeAbschnitt('baumstruktur',$Abschnitt);
unset($iH);

$this->__SQL = &Singleton::getInstance('MySQLHandler');

// end function
}

function ladeDatenFuerPfad($Pfad){
}

function ladeDatenFuerRoot(){
}

function ladeEinzelnenKnotenPerIndex($Index){

$select = "SELECT ".$this->__Config['T_Name']." AS Name, ".$this->__Config['T_VaterID']." AS VaterID, ".$this->__Config['T_Typ']." AS Typ, ".$this->__Config['T_Link']." AS Link, ".$this->__Config['T_Datum']." AS Datum , ".$this->__Config['T_Uhrzeit']." AS Uhrzeit, ".$this->__Config['T_Index']." AS PTIndex FROM ".$this->__Config['T_Tabelle']." WHERE ".$this->__Config['T_Index']." = '".$Index."'";
$result = $this->__SQL->executeTextStatement($select);
$data = $this->__SQL->fetchData($result);
$Knoten = $this->__mappeAlsDomainObjekt($data);

unset($SQL);

return $Knoten;

// end function
}

function ladeAlleOrdner(){
}

function speichereOrdnerKnoten($Knoten){
}

function speichereDateiKnoten($Knoten){
}

function hatKnotenKinder($Knoten){
}

function loescheKnoten($Knoten){
}

function __mappeAlsDomainObjekt($ResultSet){

$Knoten = new BaumKnoten();

if(isset($ResultSet['Name'])){
$Knoten->setzeName($ResultSet['Name']);
// end if
}
if(isset($ResultSet['VaterID'])){
$Knoten->setzeVaterID($ResultSet['VaterID']);
// end if
}
if(isset($ResultSet['Typ'])){
$Knoten->setzeTyp($ResultSet['Typ']);
// end if
}
if(isset($ResultSet['Link'])){
$Knoten->setzeLink($ResultSet['Link']);
// end if
}
if(isset($ResultSet['Datum'])){
$Knoten->setzeDatum($ResultSet['Datum']);
// end if
}
if(isset($ResultSet['Uhrzeit'])){
$Knoten->setzeUhrzeit($ResultSet['Uhrzeit']);
// end if
}
if(isset($ResultSet['PTIndex'])){
$Knoten->setzeIndex($ResultSet['PTIndex']);
// end if
}

return $Knoten;

// end function
}

// end class
}

?>[php]


Manager:

[php:aa6241b09f]<?

class BaumManager
{

var $__M;
var $__Session;


function BaumManager($Konfiguration = 'Standard'){
$this->__M = new BaumMapper($Konfiguration);
$this->__Session = new sessionManager('BaumAnzeige');
// end function
}

function ladePfadeInSession(){

// Läd die Pfade aus der Session und aus dem Request um festzustellen,
//bis zu welchem Knoten der Baum aufgebaut werden muss

}


function speichereKnoten($Knoten){

if($Knoten->zeigeTyp() == 'file'){
$this->__M->speichereDateiKnoten($Knoten);
// end if
}
if($Knoten->zeigeTyp() == 'dir'){
$this->__M->speichereOrdnerKnoten($Knoten);
// end if
}

// end function
}

function ladeBaum(){

$Baum = $this->ladeRoot();
$this->ladeKnoten($Baum->zeigeIndex(),&$Baum);
return $Baum;

// end function
}

function ladeRoot(){
return $this->__M->ladeDatenFuerRoot();
// end function
}

function ladeKnoten($Pfad,$Baum){

// Baum-Teile per Pfad laden
$PfadDaten = $this->__M->ladeDatenFuerPfad($Pfad);

// Pfad aus Session lesen
$Pfad = $this->__Session->loadSessionData('Pfad');

if($Pfad == false){
$Pfad = array();
// end if
}


// Baum rekursiv aufbauen
for($i = 0; $i < count($PfadDaten); $i++){

// Weitere Ebene erzeugen, oder nur Kind anfügen
if(in_array($PfadDaten[$i]->zeigeIndex(),$Pfad)){

// Neues Kind einfügen
$Tmp = $PfadDaten[$i];

// Zeige Kind-Knoten auf den ausgewählten Knoten anwenden
$this->ladeKnoten($PfadDaten[$i]->zeigeIndex(),&$Tmp);

// Knoten in Vater einsetzen
$Baum->setzeKind($Tmp);

// end if
}
else{

// Neues Kind einfügen
$Tmp = $PfadDaten[$i];

// Knoten in Vater einsetzen
$Baum->setzeKind($Tmp);

// end else
}

// end for
}

// end function
}

// end class
}
?>[/php:aa6241b09f]

Die Code-Beispiele sind gekürzt, da nicht alles relevant ist. Das sollte dir ein ungefähres Verständnis geben, wie so eine Rekursion aussehen kann.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
 


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
Nested Sets und viele Fragen... BartTheDevil89 Datenbanken 7 13.08.2008 10:18
nested set dbmodell subtrees verschieben raffnix Datenbanken 12 08.06.2008 13:27
Nested Sets oder Rekursion? litterauspirna PHP Tipps 2008 8 06.06.2008 16:57
Nested Sets in ein Mehrdimensionales Array Simon9990 PHP-Fortgeschrittene 2 29.10.2007 17:38
Nested Sets Query GSJLink Datenbanken 12 08.09.2007 10:55
nested oder getrennt? was meint ihr? Promaetheus PHP Tipps 2006 4 01.07.2006 18:18
Nested Sets und Silbings nightfreak Datenbanken 10 06.01.2006 13:58
Nested Sets History Sirke PHP-Fortgeschrittene 1 21.10.2005 08:50
erklärung gesucht: nested set query! Sirke Datenbanken 0 19.09.2005 17:24
Alternative zu Nested Sets fantast Datenbanken 1 16.08.2005 01:14
hilfe nested sets zapate Datenbanken 6 02.08.2005 02:58
Nested Sets mit Berechtigungen? daniel987 Datenbanken 3 07.06.2005 22:18
Frage zu nested sets... PHP-Fortgeschrittene 2 04.03.2005 09:57
Nested Set Trees und Pfade Datenbanken 0 16.12.2004 16:51
NESTED SETS dieses Thema sollte abgehakt werden PHP Tipps 2004 0 12.10.2004 18:18

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php nested set kombinieren mit array, nested set baumstruktur mit while php, php nested sets rekursion array

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:42 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.