[Funktion] Rekursives Array aller Templateblöcke -Funktion fehlerhaft-

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Funktion] Rekursives Array aller Templateblöcke -Funktion fehlerhaft-

    Hi,

    ich habe Probleme mit meiner rekursiven Funktion, die die Aufgabe hat alle Blöcke rekursiv zu holen und in ein Array so abzulegen das die Eltern Blöcke alle ihre Kinder untergeordnet bekommen.

    Dazu hab ich im ersten Schritt versucht lediglich die Blocknamen rauszufischen, dabei tritt eine für mich nicht wirklich replizierbare Fehlerquelle auf.

    PHP-Code:
    function _buildBlocks2($string,$cur_block="")
    {
        
    preg_match_all(sprintf($this->s_block,'.*?'),$string,$matches,PREG_SET_ORDER);
        foreach (
    $matches as $match)
        {
            
    $temp = array('name' => $match[1]); 
            if ( 
    preg_match_allsprintf($this->s_block,'.*?'),$match[2],$blocks,PREG_SET_ORDER) )
            {
                
    $temp['children']=array();
                foreach (
    $blocks as $block)
                    
    $temp['children'][]=$this->_buildBlocks2($match[2],$block[1]);
            }
        }
        return 
    $temp;

    Gewünscht ist:
    Block A
    Block B
    ..||
    ..Block B1.1
    .....|| Block B1.1.1
    .........|| Block B1.1.1.1
    .........|| Block B1.1.1.2
    Block C


    Erhalten hab ich das hier
    Block B
    ...||
    ...Block C
    ...Block C


    Das Problem ist das ich weiss, dass im Code wo der Wurm drin ist aber nicht wo.
    BTW: Wie bekommt ihr das mit den rekursiven Funktionen in den Griff?


  • #2
    auf den ersten blick:
    PHP-Code:
    $temp['children'][]=$this->_buildBlocks2($match[2],$block[1]); 
    hast du das als klasse aufgebaut? ansonsten
    PHP-Code:
    $temp['children'][]=buildBlocks2($match[2],$block[1]); 
    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Original geschrieben von Kropff
      hast du das als klasse aufgebaut?
      gruß
      peter
      Sorry, das ich es nicht erwähnt habe.
      Aber es handelt sich um eine Methode

      Kommentar


      • #4
        Re: [Funktion] Rekursives Array aller Templateblöcke -Funktion fehlerhaft-

        Original geschrieben von Caarcrinolas
        BTW: Wie bekommt ihr das mit den rekursiven Funktionen in den Griff?
        joh, rekursion ist ganz schön tricky

        ich habe es in meiner template klasse http://www.php-resource.de/forum/sho...threadid=76955 so umgesetzt:

        die blöcke werden nicht in einem klassen-array gespeichert, sondert es wird ein objektbaum aus templateobjekten rekursiv aus den blöcken aufgespannt. hört sich jetzt vielleicht kompliziert an, aber ist es auch - ne, ich fand es einfacher als ein globales array zu benutzen (hatte ich auch mal umgesetzt und fand die array-referenzen zu umständlich)
        vielleicht hilft es dir als ansatz weiter, hier die methode dazu:
        PHP-Code:
          /**
           * Builds the template object tree of (nested) blocks, if exists.
           *
           * Replaces all matches of search pattern ($this->block_regex) in template
           * content by the name of block embedded in left and right delimiters.
           * This template vars will be itialize by an empty string.
           * Creates new class instance(s) with given html content(s) of search pattern.
           * This works recursive, if sub template object(s) contains nested block(s).
           */
          
        private function _extractBlocks()
           {
            if(
        preg_match_all($this->block_regex$this->content$matches))
             {
              
        $class_name=get_class($this);

              for(
        $i=0$i<count($matches[0]); $i++)
               {
                
        // matches[0][$i] contains the full pattern matched.
                // matches[1][$i] contains the template variable/block name.
                // matches[2][$i] contains the html content.
                
        $search=$matches[0][$i];
                
        $replace=$this->left_delimiter.$matches[1][$i].$this->right_delimiter;
                
        $this->content=str_replace($search$replace$this->content);

                
        $this->blocks[$matches[1][$i]]=new $class_name();
                
        $this->blocks[$matches[1][$i]]->loadString($matches[2][$i]);
                
        $this->vars[$matches[1][$i]]='';
               }
              }
            } 

        Kommentar


        • #5
          Re: Re: [Funktion] Rekursives Array aller Templateblöcke -Funktion fehlerhaft-

          Original geschrieben von 3DMax
          joh, rekursion ist ganz schön tricky

          ich habe es in meiner template klasse http://www.php-resource.de/forum/sho...threadid=76955 so umgesetzt:

          die blöcke werden nicht in einem klassen-array gespeichert, sondert es wird ein objektbaum aus templateobjekten rekursiv aus den blöcken aufgespannt. hört sich jetzt vielleicht kompliziert an, aber ist es auch - ne, ich fand es einfacher als ein globales array zu benutzen (hatte ich auch mal umgesetzt und fand die array-referenzen zu umständlich)
          Wenn ich ehrlich bin bevorzuge ich ein Klassenarray

          Vielleicht fällt ja dem einen oder Anderen Rekursiv Experten etwas auf, zumal die Pattern generell treffen

          Kommentar


          • #6
            Das keiner die Antwort weiss ist recht unwahrscheinlich.....

            Kommentar

            Lädt...
            X