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 14-09-2008, 15:54
wurzelsepp
 Newbie
Links : Onlinestatus : wurzelsepp ist offline
Registriert seit: Sep 2008
Beiträge: 3
wurzelsepp ist zur Zeit noch ein unbeschriebenes Blatt
Standard Problem mit Rekursion

Hey,

ich habe nachfolgende Datenstruktur in einer Aufgabenstellung gegeben und soll diese Struktur wieder zusammensetzen anhand der diversen Marken wie z.B.
[Wohnzimmer]

Dabei soll ich mich aber nicht auf diesen Fall nur beschränken, d.h. es allgemeingültig halten

Datenstruktur
Bild


Bislang bin ich soweit:
PHP-Code:
function merge($start_block)
    {
        
$block $start_block;
        
        if(
$block['name'] == 'root')
        {
            echo 
$block['name']."\n";
            
$c_tpl $block['code'];
        }
        
/*  
        echo "<pre>";
        print_r($block);
        echo "</pre>";
         */
        
        
if(isset($block['nested']))
        {
            foreach(
$block['nested'] as $subblock)
            {
                echo 
$subblock['name']."\n";
                
$c_tpl preg_replacesprintf($this->bl_pattern,$subblock['name']),$subblock['code'],$c_tpl );
                
$this->merge($subblock);
                
            }
        }
        return 
$c_tpl;
        
    } 
Meine erhaltene Ausgabe ist:
Code:
root Haus Wohnzimmer Schrank Safe Schlafzimmer Hallo ich bin Max Mustermann und zeige Ihnen nun mein Haus [Haus]
Und hier sieht man das Problem auch, ich scheitere daran die Marke [Haus] mit dem entsprechenden Block auszutauschen.

Wenn ich den rekursiven Aufruf nach vorne verlagere wird das ganze in umgekehrter Reihenfolge ausgegeben, was ich vermutlich auch tun muss.

Soweit ich das verstehe muss ich irgendwie den inneren Block mit der Marke im äusseren Block vertauschen.....

Aber das bekomm ich nicht hin
Mit Zitat antworten
  #2 (permalink)  
Alt 14-09-2008, 22:13
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Als Ansatz:
Gib der Merge-Funktion zwei parameter:
merge($code,$nested);

EDIT:
ggf. könntest du auch mal die Array-Struktur mit var_export() hier posten.


Im Übrigen könnte die Struktur natürlich besser sein.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!

Geändert von TobiaZ (14-09-2008 um 22:19 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 14-09-2008, 22:59
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Bin mal wieder zu gütig und hab dir prompt die Hausaufgaben gemacht. Mein TipJar freut sich...

PHP-Code:
function merge($text,$nested)
{
    
    foreach(
$nested as $n)
    {
    
        if(isset(
$n['nested']) && is_array($n['nested']))
            
$n['code'] = merge($n['code'],$n['nested']);
            
        
$text str_replace('[' $n['name'] . ']',$n['code'],$text);
        
    }
    
    return 
$text;
    

__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #4 (permalink)  
Alt 15-09-2008, 00:36
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wow, kein wunder dass heute das Wetter so schön ist ... TobiaZ gibt freiwillig fettiche Code
Mit Zitat antworten
  #5 (permalink)  
Alt 15-09-2008, 01:53
wurzelsepp
 Newbie
Links : Onlinestatus : wurzelsepp ist offline
Registriert seit: Sep 2008
Beiträge: 3
wurzelsepp ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke @TobiaZ für deine Bemühungen....

Sorry das ich erst so spät reinschaue, habe ehrlich gesagt nicht erwartet eine Musterlösung zu erhalten.

Jedoch war dein Tipp mit dem zusätzlichen Parameter schon ausreichend.....

Nach einigem hin und her überlegen kam ich auf folgende Lösung:

PHP-Code:
function merge($start_block,$code "")
    {
        
$block $start_block;
        
        if(
$block['name'] == 'root')
            
$c_tpl $block['code'];
        else
            
$c_tpl $code;
        
        if(isset(
$block['nested']))
        {
            foreach(
$block['nested'] as $subblock)
            {
                if( 
in_array($subblock['name'],$this->regblocks) )
                    
$temp preg_replacesprintf($this->rep_pattern,$subblock['name']),$subblock['code'],$c_tpl );
                else
                    
$temp preg_replacesprintf($this->rep_pattern,$subblock['name']),"",$c_tpl );
                
$c_tpl =     $this->merge($subblock$temp);
                
            }
        }
        return 
$c_tpl;
        
    } 
Ich hab das ganze mittlerweile noch etwas verfeinert, jetzt ist es möglich die Ebenen abhängig voneinander auszublenden.

Das ist allerdings erst die zweite von 3 Hürden.....

In der letzten Teilaufgabe muss ich noch die einzelnen Ebenen abhängig voneinander realisieren können, denn es gibt Menschen die haben 2 Häuser, wovon eines komplett leer ist und das andere 2 Schlafzimmer besitzt.

Ziel ist es im Grunde genommen mittels einer Liste sich solche Modelle erstellen zu können....

Also aus
1. Variante: Haus, Wohnzimmer, Wohnzimmer, Schrank, Safe, Wohnzimmer, Safe, Safe
2. Varainte: Haus
3. Varainte: Haus, Wohnzimmer, Schrank, Schlafzimmer

Die Varianten sind exemplarisch genannt und sollen nicht als Spezialfall gesehen werden, es wird explizit eine allgemeine Lösung verlangt....

Ich habe mir überlegt in einem Array alle ankommenden Objekte fortlaufend zu übernehmen und diese Liste vielleicht über den Index durchzugehen.

Allerdings stellt sich nun die Frage wie ich innerhalb der Rekursion meine aktuelle Blocknr bestimme....

Hier fehlt mir allgemein der Ansatz......

Hättest du möglicherweise eine Idee wie ich das einfach realisieren könnte?
Dann könnte ich mich daran versuchen

Zitat:
Original geschrieben von TobiaZ
Mein TipJar freut sich...
Was meinst du damit?

Geändert von wurzelsepp (15-09-2008 um 01:56 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 20-09-2008, 01:52
wurzelsepp
 Newbie
Links : Onlinestatus : wurzelsepp ist offline
Registriert seit: Sep 2008
Beiträge: 3
wurzelsepp ist zur Zeit noch ein unbeschriebenes Blatt
Standard Vorgehensweise bei spezieller Ausgabe eines Multi Dim Arrays

Hey,

Bild

ich möchte obiges Array in bestimmten Ebenen duplizieren oder auch teilweise ausblenden und dann wiederrum zu einem reinen Text wieder zusammenbauen


Meine Wunschausgabe (zusammengebaut) sieht folgendermaßen aus:
Blöcke:

root
Wohnzimmer
Wohnzimmer
Schrank
Safe
Wohnzimmer
Schrank
Wohnzimmer
Schrank
Schrank
Wohnzimmer
Schlafzimmer
Schlafzimmer

Ich zerbreche mir den Kopf wie ich
a) an meiner rekursiven Funktion ansetze, die alles wieder zusammenbaut

und

b) wie der Benutzer eine solche fortlaufende Liste übergeben kann und daraus dann ein wie oben in der Ausgabe beschriebenes Schleifenmodell besteht....

Die Regeln wie das zusammengebaut wird gibt ja das Array vor und dem muss ich jetzt noch sagen wie er was entsprechend wiederholen soll...

Die rek. Funktion die das zusammenbaut ist folgende:
PHP-Code:
function merge($start_block,$code "")
    {
        
$block $start_block;
        
        if(
$block['name'] == 'root')
            
$c_tpl $this->replace_vars('root',$block['code']);
        else
            
$c_tpl $code;
        
        if(isset(
$block['nested']))
        {
            foreach(
$block['nested'] as $subblock)
            {
                
//if( in_array($subblock['name'],$this->regblocks) )
                
if( isset($this->regblocks[$subblock['name']]) )
                    
$temp preg_replacesprintf($this->rep_pattern,$subblock['name']),$this->replace_vars($subblock['name'],$subblock['code']),$c_tpl );
                else
                    
$temp preg_replacesprintf($this->rep_pattern,$subblock['name']),"",$c_tpl );
                
$c_tpl =     $this->merge($subblock$temp);
                
            }
        }
        return 
$c_tpl;
        
    } 
wobei diese nur von dem Fall ausgeht jeder Block existiert nur einmal und ist entweder vorhanden oder nicht vorhanden

Ich bedanke mich im Vorfeld für entsprechende Ideen die mir helfen meine Aufgabe zum Erfolg zu bringen
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 20:51 Uhr.