php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.07.2005, 01:20  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard [TEMPLATEENGINE] Problem mit dem Parsen von Arrays

Hallo,
also ich steh gerade ganz gewaltig auf dem Schlauch.
Ich zeige Euch hier gleich ein abgespeckte Form einer Template-Klasse, welche ich mir da gerade zusammendrösel.

Und irgendwie ... also verdammt nochmal, es macht nicht *klick*:

PHP-Code:
<?php

    error_reporting
(E_ALL);

    class 
Template {
    
        private 
$contentToParse;
        private 
$unparsedCode;
        private 
$parsedCode;
        private 
$parsed false;
    
    
        public function 
__construct($tplFile) {
            
            
$this->unparsedCode file_get_contents($tplFile);            
        }
        
        
         public function 
assign($tplVars$contentVars null) {
             
             if(
is_array($tplVars) && is_null($contentVars)) {
                 
                 foreach(
$tplVars as $tplVar => $value) {
                     
$this->contentToParse[$tplVar] = $value;
                 }
             }
             elseif(
is_string($tplVars) && (is_string($contentVars) || is_numeric($contentVars))) {             
                 
$this->contentToParse[$tplVars] = $contentVars;
             }
             elseif(
is_array($tplVars) && is_array($contentVars) && count($tplVars) == count($contentVars)) {
                 for(
$i 0$i count($tplVars); $i++) {
                     
$this->contentToParse[$tplVars[$i]] = $contentVars[$i];
                 }
             }             
         }
         
         
         
         public function 
parse() {
             
             
$contentToParse $this->contentToParse;
             
$codeToParse $this->unparsedCode;
             
             
$codeToParse $this->parseArray($codeToParse$contentToParse);
             
             
$this->parsedCode $codeToParse;
             
$this->parsed true;
         }
        
        
        private function 
parseArray($codeToParse$contentToParse$keys null) {
            
            foreach(
$contentToParse as $key => $value) {
                
                if(
is_array($value)) {
                                        
                    if(
is_null($keys)) {
                        
$keys = array();
                    }
                    
                    
$keys[] = $key;
                    
                    
$codeToParse $this->parseArray($codeToParse$value$keys);
                }
                else {
                    
                    
$var '';

                    if(!
is_null($keys) && array_key_exists($key$this->contentToParse[$keys[0]])) {
                        
$var sprintf('%s.%s'$keys[0], $key);
                    }
                    else {
                        
$var $key;
                    }
                    
                    
$search sprintf('{$%s}'$var);
                    echo 
$search "
"
;
                    
$codeToParse str_replace($search$value$codeToParse);
                }
            }
            
            return 
$codeToParse;
        }


        public function 
display() {
            if(!
$this->parsed) {
                
$this->parse();
            }
            
            print(
$this->parsedCode);
        }
        
    }

?>
Das ist die Klasse. Interessant dabei ist diese Methode hier:
PHP-Code:
<?php

        
private function parseArray($codeToParse$contentToParse$keys null) {
            
            foreach(
$contentToParse as $key => $value) {
                
                if(
is_array($value)) {
                                        
                    if(
is_null($keys)) {
                        
$keys = array();
                    }
                    
                    
$keys[] = $key;
                    
                    
$codeToParse $this->parseArray($codeToParse$value$keys);
                }
                else {
                    
                    
$var '';

                    if(!
is_null($keys) && array_key_exists($key$this->contentToParse[$keys[0]])) {
                        
$var sprintf('%s.%s'$keys[0], $key);
                    }
                    else {
                        
$var $key;
                    }
                    
                    
$search sprintf('{$%s}'$var);
                    
                    
$codeToParse str_replace($search$value$codeToParse);
                }
            }
            
            return 
$codeToParse;
        }

?>
Sie parsed mir Arrays. Wer hätte das gedacht *g*.
Ich kann also so etwas wie z.B. das hier damit parsen
Code:
{$link.name} 
Alles klaro. Das funktioniert auch eigentlich ganz gut, aber natürlich liegt die Betonung auf eigentlich .. sonst würde ich hier nicht posten.

Taucht nun ein Schlüssel mehrfach auf, wie hier z.B.
Code:
<h2>{$title}</h2>
{$link.name} 
so funktioniert die Methode nicht mehr.

Ich müsste also feststellen, ob der aktuelle zu bearbeitende Schlüssel, schon in einem Subarray liegt oder ob er weiter oben beheimatet ist.

Ich weiß, ich arbeite da rekursiv und denke gerade nur bis zur zweiten Dimension, aber ich hoffe, dass ich so das Prinzip verstehe.

Ich rufe die Klasse bzw. die darin implementierte Funktionalität folgendermaßen auf:
PHP-Code:
<?php

    $tpl 
= new Template('index.tpl');
    
    
$var = array(
                  
'link'  => array(
                                    
'url'   => 'http://',
                                    
'title' => 'testlink',
                                    
'name'  => 'klick mich' 
                                  
),
                  
'title' => 'Das hier ist die Überschrift'
                
);
    
    
$tpl->assign($var);

    
$tpl->display();

?>
Jo, meine Frage ist eigentlich eher ein Hilferuf nach einer Idee. Ich weiß eben nicht, wie ich es schaffe das Template so zu parsen, dass es egal sein kann, wie oft ein Schlüssel darin vorkommt.
Im Template selbst ist der Schlüssel immerhin identifizierbar, z.B. durch $link.title oder von mir aus auch $irgendwasanderes.title.

Vielleicht habe ich es etwas bei der Beschreibung vergessen .. dann fragt schnell nach und ich schau, dass ich die Informationen schnell nachreiche

Danke im Voraus,
Grüße Ben.
imported_Ben ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 30.07.2005, 03:09  
Erfahrener Benutzer
 
Registriert seit: 20.01.2005
Beiträge: 1.557
PHP-Kenntnisse:
Fortgeschritten
Buhmann ist zur Zeit noch ein unbeschriebenes Blatt
Buhmann eine Nachricht über ICQ schicken Buhmann eine Nachricht über MSN schicken
Standard

hast du denn schon herausgefunden, warum das so ist?
Um ehrlich zu sein, mich verwirrt die Funktion etwas ^^
mach doch zu testzwecken aus $keys mal n string, vllt blickt man dann besser durch ^^ und sonst n bssl kommentieren, sonst muss man (vorallem nachts um 3) fünfmal nachgucken welche variable nochmal was bedeutet, und dabei kommt man durcheinander ^^
Buhmann ist offline  
Alt 30.07.2005, 05:52  
Gast
 
Beiträge: n/a
Standard

Das mit dem $keys als String funktioniert zumindest nicht ohne weiteres für mehr als 2 Dimensionen.

Auf jeden Fall hab ichs im Zombie-Modus grad nur an Buhmanns Vorschlag angepasst.

PHP-Code:
<?php
private function parseArray($codeToParse$contentToParse$keys null
{
    foreach(
$contentToParse as $key => $value
    {
        if (
is_array($value)) 
        { 
            
$codeToParse $this->parseArray($codeToParse$value$key);
        }
        else 
       {
            
$var '';

            if (!
is_null($keys) && array_key_exists($key$this->contentToParse[$keys])) 
                {
                    
$var sprintf('%s.%s'$keys$key);
                }
                else 
                {
                    
$var $key;
                }
               
                
$search sprintf('{$%s}'$var);
                echo 
$search "
"
;
                
$codeToParse str_replace($search$value$codeToParse);
            }
        }
        return 
$codeToParse;
    }
?>
Sorry für die Scheiß Formatierung aber um diese Uhrzeit nochmal alle Tabs in Leerzeichen umbauen ... no way.

Werds mir nach dem aufstehen nochmal anschauen, hab grad ein ähnliches Problem bei einem Projekt.
 
Alt 30.07.2005, 07:54  
Gast
 
Beiträge: n/a
Standard

Hier die vereinfachte Version:
http://test.php-help.info/ben-template/ (Qwa)

Deinen Versuch, temporäre Blöcke anders zu lösen, habe ich gekillt, weil das so nicht geht. Die $ haben im Template nix verloren.

Das Ergebnis ist "KTemplate-light".
 
Alt 30.07.2005, 09:09  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 387
MrNiceGuy befindet sich auf einem aufstrebenden Ast
Standard

Ich bin mir nicht ganz sicher, ob ich da jetzt richtig denke, aber ich meine einen recht unlogischen Fehler gefunden zu haben: In der FOREACH-Schleife liest du den $Key aus der entsprechenden Ebene bereits aus, was soll also die zusätzliche Prüfung mit array_key_exists?

Ich schaue mal, was meiner Meinung nach Sinn machen würde auch für mehr als 2 Dimensionen, bin aber nicht sicher, ob das auch wirklich so funktioniert:

PHP-Code:
<?php
     
private function parseArray($codeToParse$contentToParse$keys null) { 
          
         foreach(
$contentToParse as $key => $value) { 
             
            if(
is_array($value)) { 
                               
               if(
is_null($keys)) { 
                  
$keys = array(); 
               } 
                
               
$keys[] = $key
                
               
$codeToParse $this->parseArray($codeToParse$value$keys); 

               unset (
$keys); /* Hier liegt der Fehler, weshalb du Probleme mit den gleichen Namensbezeichnungen hast */
            

            else { 
                
               
$var ''

               if(!
is_null($keys)) { 
                  
reset ($keys);
                  foreach (
$keys AS $keys_key => $keys_value)
                  {
                    
$var = ((empty ($var)) ? $keys_value sprintf('%s.%s'$var$keys_value));
                  }
                  
$var sprintf('%s.%s'$var$key);
               } 
               else { 
                  
$var $key
               } 
                
               
$search sprintf('{$%s}'$var); 
               echo 
$search "
"

               
$codeToParse str_replace($search$value$codeToParse); 
            } 
         } 
          
         return 
$codeToParse
      }
?>
MrNiceGuy ist offline  
Alt 30.07.2005, 11:07  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,
da war ich mal wieder ein gutes Vorbild, wa? *g*
Zitat:
Zitat von Buhmann
und sonst n bssl kommentieren, sonst muss man (vorallem nachts um 3) fünfmal nachgucken welche variable nochmal was bedeutet, und dabei kommt man durcheinander ^^
Ich habe hier nur meine "sample.php" gepostet ... die Originaldatei enthält mehr Kommentarezeilen als Codezeilen *g*


@MrNiceGuy:
Jupp. So läuft es .. ist ja auch klar. Hab ich Dich gut getestet *g*

Allerdings möchte ich dann noch kurz erwähnen, dass man korrekter Weise noch zwei Überprüfungen einbauen sollte, nämlich ob die Variable/das Array $keys überhaupt gesetzt ist.

entsprechende Passage aus der index.php
PHP-Code:
<?php

    
if(is_array($value)) {
                                        
        if(!isset(
$keys) || is_null($keys)) { // hier mit isset() prüfen
            
$keys = array();
        }
                    
        
$keys[] = $key;
                    
        
$codeToParse $this->parseArray($codeToParse$value$keys);
                    
        unset(
$keys);
    }
    else {
                    
        
$var '';

        if(isset(
$keys) && !is_null($keys)) { // hier mit isset() prüfen
            
$var sprintf('%s.%s'$keys[0], $key);
        }
        else {
            
$var $key;
        }    

?>
Das klappt.

@all:
Danke


Ich mach den Thread hier mal zu und eventuell später bei einem fortführendem Problem wieder auf.

Grüße und ich hoffe, falls ich hier nochmal was reinschreibe .. bis dann *g*

Ben.

temporarily closed
imported_Ben ist offline  
Thema geschlossen


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
Timestamp problem phrain PHP Tipps 2008 2 04.04.2008 09:41
Problem beim Zusammenfügen von Arrays mit array_merge PHP Tipps 2005-2 2 08.10.2005 16:44
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
Problem bei der PDF Generierung HTML2PDF von rustyparts.com joni1980 PHP-Fortgeschrittene 2 23.09.2005 16:15
[Erledigt] Problem mit Referenzen auf Arrays PHP-Fortgeschrittene 4 16.09.2005 23:13
Problem mit &amp; beim XML - Parsen PHP Tipps 2005-2 1 27.08.2005 14:08
XML Datei mit PHP Parsen - Problem mit Zeichencodierung DonTermi PHP-Fortgeschrittene 7 10.08.2005 11:36
[Erledigt] Problem mit Backslash Patrick Schwarz PHP Tipps 2005-2 5 26.07.2005 09:54
Problem mit arrays..füllen PHP Tipps 2005-2 4 22.07.2005 14:02
HIIILFE bei String Parsen / geschachtelter Font PHP Tipps 2005-2 7 19.07.2005 22:19
[Erledigt] Problem mit User/Group: nobody(99)/99 Server, Hosting und Workstations 3 09.07.2005 15:31
Verständnis Problem bei Übergabe von Arrays imported_dex PHP Tipps 2005 2 05.03.2005 18:03
Problem beim Auslesen eines Arrays aus Sql db PHP Tipps 2004 23 24.09.2004 09:39
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34
2 arrays in abhängigkeit ??? PHP Tipps 2004 2 11.08.2004 21:19

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php template array, php array parsen, php array in template, template array php, http://www.php.de/php-fortgeschrittene/27811-templateengine-problem-mit-dem-parsen-von-arrays.html, php template assign array, php template arrays, array parsen php, array template php, php array template engine, php array template, php sprintf tab, php array an template, array in template php, parse array php, php template ohne array, php template mit array, template engine arrays, template array an php, php template engine auf xml parser

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