<?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="%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.