php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.08.2009, 15:37  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Tabellen die sich selbst referenzieren

Tach auch,

ich habe eine DB-Tabelle mit den 3 Spalten id(INT), parent_id(INT), number(VARCHAR). Ziel der Tabelle ist es einträge zu verwalten, die auf einträge in der selben Tabelle verweisen, so das die Tabelle eigentlich eine Baumstruktur beinhaltet.

Ich stand zwar schon öfter vor dem problem der in sich referenzierenden Tabellen, da es sich bisher aber maximalen um eine Tiefe von 3 handelte, habe ich mich mit Dirty lösungen zufrieden gegeben. Mein aktuelles Projekt kann aber (theoretisch) eine Tiefe von 25 erreichen und da möchte ich nicht unbedingt 25 foreach´s ineinander verschachteln.



Hier mal ein beispiel wie ich bisher gearbeitet habe:

Array nach abfrage der DB:
PHP-Code:
$a = array(
=> array(
'id' => 1,
'number' => '1',
'parent_id' => 0
),
=> array(
'id' => 2,
'number' => '1.1',
'parent_id' => 1
),
=> array(
'id' => 3,
'number' => '1.1.1',
'parent_id' => 2
),
=> array(
'id' => 4,
'number' => '1.1.2',
'parent_id' => 2
),
=> array(
'id' => 5,
'number' => '1.1.3',
'parent_id' => 2
),
=> array(
'id' => 6,
'number' => '1.2',
'parent_id' => 1
),
=> array(
'id' => 7,
'number' => '1.2.1',
'parent_id' => 6
),
=> array(
'id' => 8,
'number' => '1.2.2',
'parent_id' => 6
),
=> array(
'id' => 9,
'number' => '2',
'parent_id' => 0
),
=> array(
'id' => 10,
'number' => '2.1',
'parent_id' => 9
),
10 => array(
'id' => 11,
'number' => '2.1.1',
'parent_id' => 10
),
11 => array(
'id' => 12,
'number' => '2.2',
'parent_id' => 9
),
12 => array(
'id' => 13,
'number' => '2.2.1',
'parent_id' => 12
),
13 => array(
'id' => 14,
'number' => '2.2.2',
'parent_id' => 12
),
14 => array(
'id' => 15,
'number' => '2.2.3',
'parent_id' => 12
),
15 => array(
'id' => 16,
'number' => '2.2.4',
'parent_id' => 12
)
); 
Print des Arrays, nachdem anhand der parent_id, jeder eintrag einem parent als child zugewiesen wurde:
PHP-Code:
$a = array(
=> array(
'number' => '1',
'childs' => array(
=> array(
'number' => '1.1',
'childs' => array(
=> array(
'number' => '1.1.1'
),
=> array(
'number' => '1.1.2'
),
=> array(
'number' => '1.1.3'
)
)
),
=> array(
'number' => '1.2',
'childs' => array(
=> array(
'number' => '1.2.1'
),
=> array(
'number' => '1.2.2'
)
)
)
)
),
=> array(
'number' => '2',
'childs' => array(
=> array(
'number' => '2.1',
'childs' => array(
=> array(
'number' => '2.1.1'
)
)
),
=> array(
'number' => '2.2',
'childs' => array(
=> array(
'number' => '2.2.1'
),
=> array(
'number' => '2.2.2'
),
=> array(
'number' => '2.2.3'
),
=> array(
'number' => '2.2.4'
)
)
)
)
)
); 
Ausgabe der Inhalte des Arrays:
PHP-Code:
foreach($a as $b) {
print 
$b['number'] . '<br/>';
foreach(
$b['childs'] as $c) {
print 
$c['number'] . '<br/>';
foreach(
$c['childs'] as $d) {
print 
$d['number'] . '<br/>';
}
}

Ausgabe:
PHP-Code:
1
1.1
1.1.1
1.1.2
1.1.3
1.2
1.2.1
1.2.2
2
2.1
2.1.1
2.2
2.2.1
2.2.2
2.2.3
2.2.4 
Mein Problem besteht also darin das ich zur ausgabe dann theoretisch 25 ineinander verschachtelte foreach´s benötigen würde. Was natürlich vollkommener schwachsinn ist.

nachdem ich mich jetzt über 3 Stunden mit dem problem beschäftige und mittlerweile kopfschmezen bekomme wenn ich nur an eines der Code Fragmente oben denke, würde ich mich freuen wenn mir jemand helfen würde (Sowohl bei dir findung einer lösung als auch auf der Suche nach einem geeigneten Titel).

Danke & Gruß
Squall

Geändert von nikosch (03.08.2009 um 19:15 Uhr). Grund: Kein Bock mehr
Squall ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 03.08.2009, 15:40  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.256
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Das Zauberwort lautet rekursive Funktion.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 03.08.2009, 16:03  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

Wenn ich dich richtig verstehe meinst du mit rekursiv eine funktion wie:

PHP-Code:
function tree($a) {
foreach(
$a as $b) {
print 
$b['number'] . '<br/>';
tree($b['childs']);
}
}
tree($a); 
Womit auch die Problemstufe 1 (übersichtlichkeit) gelöst währe.

An der Stelle war ich aber auch schon vor knapp 2 Stunden was mich zu Problemstufe 2 geführt hat (Bin vorhin nicht weiter darauf eingegangen da ich nicht wusste ob mein problem überhaupt verständlich ist).

ich möchte nähmlcih eigentlich nicht das:
PHP-Code:
foreach($a as $b) {
print 
$b['number'] . '<br/>';
foreach(
$b['childs'] as $c) {
print 
$c['number'] . '<br/>';
foreach(
$c['childs'] as $d) {
print 
$d['number'] . '<br/>';
}
}

sondern sowas machen:
PHP-Code:
foreach($a as $b) {
print 
'<tr><td class="ebene_1">' $b['number'] . '</td></tr>';
foreach(
$b['childs'] as $c) {
print 
'<tr><td class="ebene_2">' $c['number'] . '</td></tr>';
foreach(
$c['childs'] as $d) {
print 
'<tr><td class="ebene_3">' $d['number'] . '</td></tr>';
}
}

Und an der Stelle hat dann der verstand aufgehört mit zu spielen.

Geändert von nikosch (03.08.2009 um 19:15 Uhr). Grund: Kein Bock mehr
Squall ist offline  
Alt 03.08.2009, 16:04  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.256
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Da musst Du Dich mit Zettel und Stift selbst durchkämpfen. Eine fertige Lösung bekommst Du nicht von mir.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 03.08.2009, 16:10  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.071
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

EDIT: Mist.. Der Beitrag war noch nicht fertig, sorry

Käse.. kannst du den Post löschen, nikosch? Ich hatte irgendwo noch so eine ähnliche rekursive Funktion rumfliegen, die einen Verzeichnisbaum erzeugt. Find sie jetzt nicht mehr! Sorry!

EDIT2: vielleicht doch noch was "konstruktives": Es heißt "children" und nicht "childs"
__________________
HalloPHP

Geändert von Asipak (03.08.2009 um 16:37 Uhr).
Asipak ist offline  
Alt 03.08.2009, 16:58  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Da musst Du Dich mit Zettel und Stift selbst durchkämpfen. Eine fertige Lösung bekommst Du nicht von mir.
Danke, frage mich wieso ich nicht selbst darauf gekommen bin es erstmal alleine zu versuchen, bevor ich 1:30h in diesen verkackten Thread investiere.

Ps.1: Ich habe noch nie eine fertige Lösung erwartet!

Ps.2: Kannst weder du noch sonst jemand eine fertige Lösung anbieten, da ich diese sowieso erstmal an mein Script anpassen müsste.

Ps.3: Du beschwerst dich jedesmal wenn jemand sein Problem nicht auf den Punkt bringen kann. Bringt man es denoch auf den Punkt, verweigerst du deine Hilfe. In meiner Sprache nennt man sowas einen Heuchlere.

@Any other Mod
Thema kann geschlossen werden. Die Lösung ist mir mittlerweile egal.
Squall ist offline  
Alt 03.08.2009, 17:09  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.071
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Da hast du vermutlich Recht, aber eigentlich will er doch auch nur, dass du etwas lernst. Ich halte dich für clever, nikosch vermutlich auch, und vielleicht dachte er, er könne dir etwas mehr zumuten und die Idee mit Stift und Zettel ist doch keine Schlechte

Außerdem bist du doch nicht auf seine Hilfe angewiesen, hier hätten sich ja auch noch weitere User beteiligen können!

Hätte dir auch gerne geholfen. Aber so aus dem Nichts hatte ich leider keine Lust mich an so einer Funktion zu versuchen und meine "alte" Funktion habe ich leider nicht mehr gefunden

Dieses Script: php4yourself.de - Baumdiagramm mit PHP erzeugen habe ich mal zum Zeichnen von Baumdiagrammen gecodet. Ist mitlerweile Überholgsbedürftig und auch nur für den Einsatz mit der GD-Bibliothek gedacht. Vielleicht kannst du aber die rekursive Funktion zum Zeichnen der Äste extrahieren! Die Beziehung Vater <-> Kind ist allerdings etwas anders und meiner Meinung nach nicht zu empfehlen (wie gesagt, ist leider nicht auf dem Neuesten Stand).
__________________
HalloPHP
Asipak ist offline  
Alt 03.08.2009, 19:18  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.256
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Dieses Board ist nicht Deine persönliche Trollwiese.

[MOD: Thread wieder hergestellt]

Ich finde die Reaktion vollkommen unangemessen.
Zitat:
und vielleicht dachte er, er könne dir etwas mehr zumuten und die Idee mit Stift und Zettel ist doch keine Schlechte
Ganz genau. Zettel und Stift ist ein guter Tipp, immer wenn man sich in etwas verrannt hat. Eine Nacht drüber schlafen auch. Hier alles zu löschen und ungehalten reagieren nicht.
Zitat:
Und an der Stelle hat dann der verstand aufgehört mit zu spielen.
Antworten wie diese sind i.A. billige Ausreden. In allen anderen Fällen sind es nutzlose Informationen, weil sie nicht beschreiben, woran man gescheitert ist.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 03.08.2009, 20:46  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 1.898
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Vielleicht hilft dir der link hier weiter:

nested sets
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist gerade online  
Alt 03.08.2009, 21:30  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.341
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Also nur mal so überflogen, aber ich denke, daß man mit ner vernünftgen SQL-Anweisung ein dem entsprechend verarbeitbares Array erhalten kann, mit dem die Ausgabe relativ einfach ist...

Ansonsten ist der Link von rudygotya das, was Du brauchst...
Arne Drews 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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
tabelle auf sich selbst referenzieren, selbst referenzieren, sql tabelle auf sich selbst verweisen, sql tabelle verweist auf sich selbst, datenbank tabelle auf sich selbst referenzieren, datenbank tabelle auf sich selbst verweisen, sql selbst referenzieren, php auf sich selbst verweisen, tabelle referenziert sich selbst, rekursive tabelle auf sich selbst referenzieren, sql tabelle referenziert sich selbst, sql tabelle referenziert auf sich selbst, sql server tabelle auf sich selbst referenzieren, referenz \selbe tabelle\, sql referenziert, sql tabelle referenzieren, tabelle auf sich selbst referenzieren sql, tabelle verweist auf sich selbst sql, sql referenzieren, datenbankmodellierung referenziert auf sich selber

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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