php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.10.2007, 16:16  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard rekursion ist nicht mein freund.... ;-)

ich habe mir eine abfrage für meinen menübaum gebastelt welche auch super funktioniert (JAAAA ich weiss... mit nested sets wäre es besser als mit parent, aber ich bin schon froh dass ich es so hinbekommen habe.

nun wird einfach die jeweilige id des letzten astes an einen string angehängt: 1_3_7_10 usw.

die letzte id ist immer der gerade aktive content. das klappt auch super. ich habe mir jetzt aber überlegt um nicht immer mit dem lange string auf den bestimmten content verlinken zu müssen dass ich nur die id (also die letzte id des strings) übergebe und mir dann ganz einfach den pfad zur root id mittels rekursion ausgeben lasse. also einfach solange nach der parend_id suchen bis diese 0 ergibt.

aber mit eben dieser rekursion habe ich probleme:
PHP-Code:
<?php
// beispiel dump
// content1: ID 1, parentId 0
// content2: ID 2, parentId 1
// content3: ID 3, parentId 2
// content4: ID 4, parentId 3

function mkString($id$str) {
  
$sql "SELECT parentId FROM navigation WHERE ID = $id";
  
$query mysql_query($sql);
  
$data mysql_fetch_assoc($query);
  
$str.= '_'.$id;
  if(
$data['parentId'] != 0mkString($data['parent_id'], $str);
  return 
$str;
}

echo 
mkString(4'');
?>
ich hätte mir erwartet dass mir dann alle id`s als string getrennt durch _ wiedergegeben werden. in meinem beispiel _4_3_2_1. das ist aber nicht der fall. ich dachte es wird wieder mit kopien gearbeitet und habe &str versucht, jedoch auch nicht mit dem korrekten ergebnis.

habe ich da einen grundlegenden denkfehler in meinem vorhaben?
__________________
mfg Alexander Haim
Promaetheus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 10.10.2007, 16:20  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

du benutzt den return value auch nicht

PHP-Code:
#
  
if($data['parentId'] != 0$str=mkString($data['parent_id'], $str); 
brian johnson ist offline  
Alt 10.10.2007, 16:37  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

danke für den hinweis. jetzt läuft es. rekursionen machen mir einfach immer wieder schwierigkeiten. da raucht das hirn und der knoten in selbigem ist vorprogrammiert.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 10.10.2007, 20:58  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

ich habe das ganze nun gelöst. was haltet ihr davon. sehr umständlich? könnten sachen verbessert werden? vor allem die lösung wenn nur eine content ID übergeben ist ohne den string mit allen aufgeklappten ID´s gefällt mir persönlich nicht so gut, ich konnte es aber nicht anders lösen.

PHP-Code:
<?php

/**
 * @file navigation.php
 * @since 10.10.2007 20:57:17
 * @version 1.0
 */
 
// $params entspricht immer $_GET variablen
// $lang wird auch bereits existent übergeben

function navTree($parent,$lcat) {
  global 
$idarr;      // array mit allen id´s die aufgeklappt sind
  
global $lang;
  static 
$depth 0// wird bei jedem funktionsaufruf erhöht

  
$sql "SELECT t1.c_id,
                 t1.c_parent,
                 t1.c_sortorder,
                 t2.cd_nav
          FROM "
.TABLE_CMS." AS t1,
               "
.TABLE_CMS_DATA." AS t2
          WHERE t1.c_id = t2.c_id
          AND   t2.cd_lang='"
.$lang."'
          AND   t1.c_parent = '"
.$parent."'
          ORDER BY t1.c_sortorder"
;
  
$query[$depth] = mysql_query($sql);
  
$count mysql_num_rows($query[$depth]);

  for (
$lo=0;$lo<$count;$lo++) {
    
$data mysql_fetch_assoc($query[$depth]);
    
// c_id        = ID des bestimmten contents
    // c_parent    = parent ID des contents (bei oberster tiefe 0)
    // c_sortorder = reihenfolge der navigationselemente
    // cd_nav      = text der angezeigt wird
    
$menu textlink(CMS_PREFIX.'cms/'.$lang.'/cat_'.$lcat.'_'.$data['c_id'], $data['cd_nav']).'
'
;

    if (
$depth 0) {  // immer weiter einrücken
      
echo str_repeat("",$depth);  //$depth ist anzahl der wiederholungen
    
}

    echo 
$menu;

    
// tochterelemente auflisten
    
if (array_key_exists($depth+1$idarr) && $data['c_id'] == $idarr[$depth+1]) {
      
$depth++;
      
navTree($data['c_id'],$lcat.'_'.$data['c_id']);
      
$depth--;
    }
  }
}

// string mit rekursiver abfrage aus gegebener ID zusammenbasteln
function getIdString($id$str) {
  
$sql "SELECT c_id,
                 c_parent
          FROM "
.TABLE_CMS."
          WHERE c_id = '"
.$id."'";
  
$query mysql_query($sql);
  
$data mysql_fetch_assoc($query);
  
$str.= '_'.$data['c_id'];
  if(
$data['c_parent'] != 0$str getIdString($data['c_parent'], $str);
  return 
$str;
}

if(isset(
$params['cat'])) { // wenn bereits eine kategorie übergeben ist, sprich ein string mit den ids
                            // dann soll das auch verwendet und aufgeklappt werden
  
$idarr explode("_",$params['cat']); // aus der cat (string mit id´s) wird ein array $idarr
  
$count count($idarr);
  
$cId $idarr[$count-1];
} elseif(!isset(
$params['cat']) && isset($params['cId'])) { // wenn nur eine id gegeben ist so soll
                                                            // aus dieser ID rückwärts der string mit allen
                                                            // benötigten ID´s zusammengestellt werden
  
$arr explode("_"getIdString($cId'')); // string nun in ein array lesen
  
$x 1;
  for(
$i=count($arr)-1$i>0$i--) {  // und den array rückwärts in das korrekte $idarr array speichern
    
$idarr[$x] = $arr[$i];
    
$x++;
  }
}  else {
  
$idarr = array(); // wenn nichts gegeben ist soll idarr existieren aber leer sein um keine fehlermeldung
                    // zu bekommen
}

navTree(0,''); // starte die Funktion, liste alles auf was als parent 0 hat
?>
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 11.10.2007, 12: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 Alex,

derartige Geschichten musst du mit Sessions lösen. In der Session werden immer die bereits geöffneten Zweige (IDs) gehalten und bei einer Öffnen- oder Schließen-Aktion muss immer nur die Art der Aktion und der gerade geklickte Knoten übergeben werden. Zuklappen ist einfach ein Löschen einer ID aus dem Array, Öffnen das hinzufügen. In der rekursiven Abfrage des Baumes musst du dann einfach die IDs der Session abfragen und so den Baum zusammenbauen. Solltest du ein Beispiel benötigen, kann ich dir mal ein Implementierungsbeispiel schicken.
__________________
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  
Alt 11.10.2007, 13:07  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

hallo christian! ich kann mir nicht so recht vorstellen wie ich das mit sessions lösen könnte. du verwendest dabei aber auch id und parentId oder? wäre nett wenn du mir ein beispiel zukommen lassen könntest, denn wie gesagt kann ich mir das nicht so recht vorstellen. allerdings müsste ich dann ja immer eine session erstellen.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 11.10.2007, 18:49  
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 Alex,

ich habe dir unter

http://www.adventure-php-framework.o...umstruktur.zip

ein Beispiel abgelegt, wie so etwas funktionieren kann. Das Beispiel gibt eine Ordnerstruktur aus, wie es im Windows Explorer der Fall ist, mit dem Unterschied, dass auch Datei-Knoten im Baum angezeigt werden.

Die eigentliche Arbeit wird in der Business-Schicht getan. Hier wird zunächst die Methode "ladePfadeInSession()" des "BaumManager" aufgerufen. Diese "merkt" sich die geöffneten Knoten in der Session oder bearbeitet die Session wie oben beschrieben. Mit der Methode "ladeBaum()" kann man einen Objekt-Baum laden, der mit Hilfe der Datenschicht-Komponente aus der Datenbank gelesen wird. Die eigentliche Rekursion wird mit Hilfe der Methode "ladeKnoten()" erledigt, die den Baum mit Hilfe des Objektes "BaumKnoten" aufbaut. Die Beziehung basiert dabei auf einer ParentID-Beziehung.

Die Implementierung ist leider schon etwas älter, deswegen ist die Dokumentation nicht so optimal, aber ich bin sicher du kannst dir Ideen herausziehen. Die Session-Klasse ist die des Frameworks in meinem Footer, ein Beispiel für die Anwendung geht wie folgt:

PHP-Code:
<?php
   
// Baum laden
   
$BM = &$this->__getServiceObject('modules::baumstruktur::biz','BaumManager');
   
$BM->ladePfadeInSession();
   
print_r($BM->ladeBaum());
?>

Die Tabelle dahinter ist recht banal:

Code:
CREATE TABLE kulturtechnik (
  Name varchar(60) NOT NULL default '',
  VaterID int(5) NOT NULL default '0',
  Typ varchar(4) NOT NULL default '',
  Link varchar(100) NOT NULL default '',
  Datum date NOT NULL default '0000-00-00',
  Uhrzeit time NOT NULL default '00:00:00',
  PTIndex int(5) NOT NULL auto_increment,
  PRIMARY KEY  (PTIndex),
  KEY Typ (Typ),
  KEY Name (Name),
  KEY VaterID (VaterID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
__________________
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
Rekursion zur Ausgabe von Kategorien und Unterkategorien goofreezer PHP Tipps 2008 19 20.06.2008 10:43
Nested Sets oder Rekursion? litterauspirna PHP Tipps 2008 8 06.06.2008 16:57
Türme von Hanoi - Rekursion Erecthoma2006 PHP Tipps 2006 7 07.06.2006 18:54
rekursion in php netdirk PHP Tipps 2006 10 13.05.2006 12:08
Wie nennt man so etwas? Rekursion bei Klassen? Andreas PHP Tipps 2007 3 16.11.2005 12:50
Gesucht wird ein PHP Programmierer/in und Freund! Beitragsarchiv 17 17.09.2005 17:54
Rekursion als sql DerDesian Datenbanken 1 20.04.2005 11:59
Klassen Frage!!! PHP-Fortgeschrittene 20 04.03.2005 22:24
[Erledigt] Partitionen Off-Topic Diskussionen 9 02.08.2004 14:57
Rekursion PHP Tipps 2004 2 15.06.2004 11:31

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
baumstruktur parend_id php, mkstring php, sql string rekursiv, rekursionsgleichung lösen einfach

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