simplecontent

PHP Snippets und Beispiele

Inhaltsverzeichnis A-Z Register
Beispiel ausführen

Eine hierarchische Sitemap

Das folgende Skript zeigt wie man auf einfache Weise eine komplexe hierarchische Struktur abbilden kann. Hier wird dazu eine einfache Textdatei (flatfile) benutzt. Diese ist leichter zu warten als eine mehrfach verschachtelte Array-Struktur. Das kann man gut für eine einfache SiteMap oder eine kleine Linkliste benutzen. Da die Struktur in einem Array vorliegt könnte man damit auch ein dynamisches JavaScript-Menue füttern. Das PHP Code Beispiel:
<?php
/**
* simplemenue.php
* ===============
*/


////////////////////////////////////////////////////////////
// VARIABLES


$content = <<< EOT


Service
    - Downloads

        -- PC                ; /sampleurl/pc_download.html
            --- Windows        ; /sampleurl/windows.html
            --- Linux        ; /sampleurl/linux.html
        -- MAC                ; /sampleurl/mac_download.html

    - help                    ; /sampleurl/help.html
        -- User Forum            ; /sampleurl/forum.html
        -- FAQs                ; /sampleurl/faq.html
        -- Customer Feedback Form    ; /sampleurl/feedback.html

Produkte

    - schöne Sachen
        -- teuer            ; /sampleurl/schoenundteuer.html
        -- billig            ; /sampleurl/schoenundbillig.html

    - nützliche Dinge
        -- teuer            ;/sampleurl/nutzen/teuer.html
        -- billig             ;/sampleurl/nutzen/billig.html




Kontakt

    - Webformular            ;/sampleurl/feedback.html
    -Vertrieb
        -- Deutschland                ;/sampleurl/deutschland.html

        -- Europa
            --- Osteuropa            ;/sampleurl/osteuropa.html
            --- Südeuropa            ;/sampleurl/suedeuropa.html
            --- Westeuropa            ;/sampleurl/westeuropa.html
        -- Afrika
            --- Nordafrika            ; /sampleurl/nordafrika.html
            --- Südafrika            ; /sampleurl/suedafrika.html

        -- Amerika
            --- USA ; /sampleurl/usa.html
            --- Latein- und Mittelamerika    ; /sampleurl/lateinamerika.html

    - Adressen                ; /sampleurl/adressen.html
        -- Sekretariat            ;/sampleurl/schmidt.html
    - Anfahrt
        -- Anfahrtsskizze
        -- Fahrplananzeige

    -Impressum                ; /sampleurl/impressum.html
EOT;


// END: VARIABLES
////////////////////////////////////////////////////////////








////////////////////////////////////////////////////////////
// FUNCTIONS


/**
* nimmt String entgegen und entfernt
*  1. Leerzeilen
*  2. Kommentar-Zeilen (# am Zeilenanfang)
*  3. mehrzeilige Kommentare
* liefert verbleibende Zeilen als Array zurück
*/

function prepare_data($s)
{
    
$stack = array();
    
$tmp $s;

    
// mehrzeilige Kommentare entfernen
    
$tmp preg_replace ('#/\*(.*)\*/#sU'''$tmp);

    
$tmp explode ("\n"$tmp);

    foreach (
$tmp as $s){

        
$s trim($s);

        
// Leerzeilen auslassen
        
if (empty($s)){
            continue;
        }

        
// Kommentarzeilen auslassen
        
if (substr($s01) == '#'){
            continue;
        }

        
$stack[] = $s;

    }
    return 
$stack;
}



// Build Menue-Array

function build_menue_array($contents$root_label='Wurzelelement')
{

    
$initial_data = array(
     
'INDENT'  => false,
     
'PARENT' => false,
     
'LABEL'  => 'LABEL MISSING',
     
'HREF' => false,
     
'CHILDREN'=> array(),
    );

    
$last_indent 0;
    
$indent 0;
    
$parent 0;
    
$last_parent = array(=> 0);

    
$elements = array();

    
// Platzhalter für Wurzelelement ergänzen
    
array_unshift($contents'DUMMY');

    
$n count($contents);

    
$elements[0] = $initial_data;
    
$elements[0]['LABEL'] = $root_label;



    for (
$i=1$i$n;$i++){

        
// Initialize
        
$elements[$i] = $initial_data;


        
$s =  $contents[$i];

        
// get level of current element

        
$success preg_match('#(-*)([^;]*)\;?(.*)#'$s$match);

        if (
$success){
            
$indent strlen($match[1]);
        }else{
            
$indent 0;
        }

        
$label trim($match[2]);
        
$href trim($match[3]);

        if (
$indent $last_indent){
            
$parent $last_element;
            
$last_parent[$indent] = $parent;
            
$last_indent $indent;
        }

        if (
$indent $last_indent){
            
$parent $last_parent[$indent];
            
$last_indent $indent;
        }

        if (
$indent == $last_indent){
            
// do nothing
        
}

        
array_push($elements[$parent]['CHILDREN'],$i);
        
$elements[$i]['INDENT'] = $indent;
        
$elements[$i]['PARENT'] = $parent;
        
$elements[$i]['LABEL'] = $label;
        
$elements[$i]['HREF'] = $href;
        
$last_element $i;
    }

    return 
$elements;
}



function 
build_menue($start$data)
{
    
$tmp '';
    
$arr $data[$start];

    if (!empty (
$arr['HREF'])){
        
$tmp .= sprintf ('<a href="%s">%s</a>'$arr['HREF'] ,$arr['LABEL']);
    }else{
        
$tmp.= sprintf ('<em>%s</em>'$arr['LABEL']);
    }

    if (
count ($arr['CHILDREN'])>0){

        
$tmp .= '<ul>';
        foreach (
$arr['CHILDREN'] as $c){
            
$tmp .= '<li>'.build_menue($c$data).'</li>'."\n";

        }
        
$tmp .= '</ul>'."\n";
    }

    return 
$tmp;
}


// END: FUNCTIONS
////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////
// MAIN


$contents Prepare_Data($content);

$elements build_menue_array($contents'Sitemap');

echo 
build_menue(0$elements);


// END: MAIN
////////////////////////////////////////////////////////////
?>

Dieses PHP Snippet soll in erster Linie als Beispiel und Anregung für eigene Bemühungen dienen.
Gerne darf man es für Projekte aller Art benutzen.
Möchte jemand das Snippet also solches in ähnlicher oder anderer Form veröffentlichen ist ein kleiner Hinweis auf simplecontent.net nicht zuviel verlangt oder Herr Koch?
Für die Abwesenheit von Fehlern kann natürlich keine Gewähr gegeben werden.