Eine hierarchische Sitemap

Beispiel ausführen
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.
<?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="http://example.org%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
////////////////////////////////////////////////////////////
?>

Benutzte Funktionen


Hinweise zum DatenschutzImpressum © 2005-2008 S. Eickhoff