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($s, 0, 1) == '#'){
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 => 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
////////////////////////////////////////////////////////////
?>