php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 19-06-2007, 09:25
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard Hilfe bei Nested Sets?

Hallo,

ich habe in einem csv-file eine Struktur mit id, parent_id und titel.
Zitat:
1#0#Kategorie 1
2#0#Kategorie 2
3#1#Forum 1
4#2#Forum 2
5#3#Unter Forum 1
6#4#Unter Forum 2
die schreibe ich in ein 2 dimensionelles array. im 1. array befindet sich die id und im 2. array, befindet sich parent_id und titel sowie left_id und right_id. left_id und right_id setz ich bei einlesen erstmal auf 0.
PHP-Code:
    $arrForums = array();
    
$handle fopen("cat.txt""r");
    if (
$handle):
        while (!
feof($handle)):
            
$exp explode('#',fgets($handle4096));
            
$arrForums[$exp[0]] = array($exp[1],$exp[2],0,0);
        endwhile;
        
fclose($handle);
    endif; 
als zweiten Schritt möchte ich gern die left_id und right_id für jedes element ermitteln. komm mit dem prinzip von Nested Sets nicht klar, hab mich auch schon mit paar tuts rumgeschlagen. ohne erfolg auf durchblick.

kann mir jemand da etwas auf die sprünge helfen, wie ich das realisieren könnte. vorallem wenn ich es in einem array setzen will und nicht direkt in die datenbank?

Danke
Mit Zitat antworten
  #2 (permalink)  
Alt 19-06-2007, 09:36
Koala
 PHP Junior
Links : Onlinestatus : Koala ist offline
Registriert seit: Jan 2006
Beiträge: 887
Koala ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Du mußt das nachbilden:
http://www.klempert.de/nested_sets/artikel/#kap1

Zitat:
eine Struktur mit id, parent_id und titel.
und das reicht natürlich nicht aus !

nested sets ticken anders, nämlich mit linkem und rechtem Wert - anders ausgedrückt:
bei Deiner Struktur fehlt die Angabe WO sich das Element befindet
(bei einem Untermenu z.B. ob es das erste oder zweite Menuelement ist.)
Du könntest natürlich annehmen, daß das Element mit der niedrigsten ID ganz links steht und die anderen aufsteigend nach der ID sortiert rechts davon.

Also brauchst Du ein Script welches Schritt für Schritt den Weg des Wurms nachbildet.
Alle Fragen die sich der Wurm stellt, muß sich auch Dein Script stellen: gibt es ein Element rechts von mir mit einer höheren Id ? wenn nein -> hoch zum Parent-Element usw.

Das würd ich erst mal in Pseudocode aufeschreiben und dann den richtigen Code.

Um nested sets zu verstehn, solltest Du mal ein paar Bäume von Hand mit Kuli und Papier gezeichnet und beschriftet haben.


Geändert von Koala (19-06-2007 um 09:45 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 19-06-2007, 09:40
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hab das tut schon komplett durchgelesen und hab es versucht nach zu bilden. aber raff das einfach nicht
Mit Zitat antworten
  #4 (permalink)  
Alt 19-06-2007, 09:47
Koala
 PHP Junior
Links : Onlinestatus : Koala ist offline
Registriert seit: Jan 2006
Beiträge: 887
Koala ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hab oben noch mal editiert - bitte lesen.

----------

Warum tust Du Dir das an ?

Und den Mist auch noch aus einer Textdatei auslesen und dann in ein Array ?

Masochismus pur.

P.S.: arbeitest Du mit PHP 3 ? endwhile ist schon lange nicht mehr aktuell.

Geändert von Koala (19-06-2007 um 09:49 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 19-06-2007, 10:27
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich muss mir das antun! weil ich einen Import von Foren aus der CSV-Datei in das neue phpBB-Forum machen will.

Dieses hat neben der Parent_ID eine Left_id und right_id. Und diese gilt es zu ermitteln. die patent_id hilft dabei zu sagen, welches element von welchem element abstammt.

zu endwhile: ich nutze den alternativ-syntax weil er für mich wesentlich übersichtlicher ist und mir bei langem code sagt, welche schleife jetzt z.b. aufhört. so muss ich mich ne durch viele "}" kämpfen, wenn ich viel verschachtelt habe!
Mit Zitat antworten
  #6 (permalink)  
Alt 19-06-2007, 10:59
Koala
 PHP Junior
Links : Onlinestatus : Koala ist offline
Registriert seit: Jan 2006
Beiträge: 887
Koala ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich hab Dir doch geschrieben wies geht !

Erwartest Du jetzt ein fertiges Script ?

Hier gibts Denkanstöße für Programmierer - Hilfe zur Selbsthilfe !
Mit Zitat antworten
  #7 (permalink)  
Alt 19-06-2007, 11:46
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

http://www.google.de/search?q=adjace...ert+nested+set
vor allem empfehlenswert sind die artikel von joe celco.
Zitat:
ich nutze den alternativ-syntax weil er für mich wesentlich übersichtlicher ist und mir bei langem code sagt, welche schleife jetzt z.b. aufhört.
schuld ist nicht die syntax, sondern der lange code.
Mit Zitat antworten
  #8 (permalink)  
Alt 19-06-2007, 12:06
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja, hab das problem erstmal zu 75% gelöst, in dem das direkt in die sql-db geschrieben habe.

ab parent_id 3 werden zwar die unterforen nciht angezeigt, abe im admin-panel schon. komisch!
naja, mal sehen wo es klemmt.

PHP-Code:
    $arrForums = array();
    
$handle = @fopen("cat.txt""r");
    if (
$handle):
        while (!
feof($handle)):
            
$exp explode('#',fgets($handle4096));

            if (
$exp[1] == 0) {
                
$sql "INSERT INTO forums (forum_id,parent_id,left_id,right_id,forum_name,forum_type)
VALUES ('"
.$exp[0]."','".$exp[1]."','1','2','".$exp[2]."',0)";
                
$result mysql_query($sql);
                echo 
$sql.'<br />';

            } else
            {
                
$sql "SELECT right_id FROM forums WHERE forum_id='".$exp[1]."'";
                
$result mysql_query($sql);
                
$row mysql_fetch_array($result);
                
                
$sql "UPDATE forums SET right_id=right_id+2 WHERE right_id>=".$row['right_id'];
                
$result mysql_query($sql);

                
$sql "UPDATE forums SET left_id=left_id+2 WHERE left_id>=".$row['right_id'];
                
$result mysql_query($sql);

                
$sql "INSERT INTO forums 
(forum_id,parent_id,left_id,right_id,forum_name,forum_type,enable_icons,prune_days,prune_viewed,prune_freq) 
VALUES ('"
.$exp[0]."','".$exp[1]."','".$row['right_id']."','".($row['right_id']+1)."','".$exp[2]."',1,0,7,7,1)";
                
$result mysql_query($sql);

                echo 
$sql.'<br />';

            }

        endwhile;
        
fclose($handle);
    endif; 

Geändert von TriphunEM (19-06-2007 um 12:22 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 19-06-2007, 12:13
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TriphunEM
naja, hab das problem erstmal zu 75% gelöst, in dem das direkt in die sql-db geschrieben habe.
das ist doch falsch. es sind verschiedene datenstrukturen. also sind es keine 75% sondern 0%.

brich deinen code um.
Mit Zitat antworten
  #10 (permalink)  
Alt 19-06-2007, 12:23
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

na funktioniert aber. den das erste forum mit allen unterforen wird genau so importiert wie ich mir das vorgestellt habe. warum es bei den anderen ne klappt, weiß ich noch ne!
Mit Zitat antworten
  #11 (permalink)  
Alt 19-06-2007, 12:25
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
na funktioniert aber.
dann wären es 100%.
Zitat:
den das erste forum mit allen unterforen wird genau so importiert wie ich mir das vorgestellt habe.
weil es ein zufall ist.
Zitat:
warum es bei den anderen ne klappt, weiß ich noch ne!
weil du die empfohlenen quellen nicht gelesen hast und keine ahnung hast, was eine adjazenzliste bzw. nested set ist.
Mit Zitat antworten
  #12 (permalink)  
Alt 19-06-2007, 12:35
TriphunEM
 Registrierter Benutzer
Links : Onlinestatus : TriphunEM ist offline
Registriert seit: Jun 2003
Beiträge: 549
TriphunEM ist zur Zeit noch ein unbeschriebenes Blatt
Standard

doch genau mit dem tuts hab ich mich auseinander gesetzt und auch anhand dieser den code gemacht.
reiner zufall, dann zeig mir bitte die stellen woran das ganze scheitern soll. denn die db-struktur sieht eigentlich genau so aus, wie sie soll- oder ich hab was falsch verstanden!
Mit Zitat antworten
  #13 (permalink)  
Alt 19-06-2007, 12:41
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

das sieht schon besser aus.
lass dir nun alles queries ausgeben (samt fehlern) und kontrolliere ihre richtigkeit.
und benutze keine hochkommata für numerische spaltentypen.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:03 Uhr.