switch()

milkboy

Aktives Mitglied
Hallo

Ich bin dabei ein kleines Script zu programmieren, welches ein bestimmtes Verzeichnis ausliest und den Inhalt in einer liste ausgibt.

Um die Dateien optisch besser erkennbar zu machen füge ich passend zur Dateiendung (*.txt, *.php usw.) ein kleines Icon ein.

Um die Dateiendung einem bestimmten Icon zuzuweisen arbeite ich mit switch()

CODE switch($ext)
{
case "dir":
$extpic = "dir.jpg";
break;

case "html":
$extpic = "html.jpg";
break;
}


Das funktioniert soweit einwandfrei.


FRAGE: Wie kann ich es machen, damit ich nicht pro Dateiendung ein "case" einbauen muss. Kann ich mehrere Endungen zusammenfassen? (Bsp: html, php, asp, js und xls, csv)
 
Wie meinst du das?
Eine Möglichkeit wäre, wenn du z.B. einem Icon zwei Endungen zuordnet würdest.
Icon html -> .htm oder .html

Meinst du das?

CODE
switch ($ext) {
case "htm": case "html":
$extpic = "htm.jpg";
break;
 
CODE
$images = array(
'dir' => 'dir.jpg',
'html' => 'html.jpg');

$extpic = NULL;
if (isset($images[$ext]))
$extpic = $images[$ext];



Das ist denke ich die einfachste Lösung. Wenn die Liste allerdings sehr variable ist, könnte man einfach ein Bild-Verzeichnis Scan machen, um zu erfahren welche Dateieindungen eigene Icons haben, und dann da wo ein eigenes Icon existiert einfach das zu verwenden.

zB.:

CODE
$extpic = NULL;
if (file_exists($ext . '.jpg'))
$extpic = $ext . '.jpg';



dazu sollte man sich aber noch ein Caching ausdenken, denn sonst kann es recht belastend werden. Ausserdem sollte da die Variable $ext noch gründlich kontrolliert werden, damit es nicht zu einbrüchen kommt.
 
Nimm ein assoziatives Array bzw Hash. Die Endungen nimmst Du dann als Key.

$endungen = array();
$endungen['dir'] = "dir.jpg";

Auslesen mit $endungen[$ext] ... mit schönen Tests ob defined und nicht leer und sowas.
wink.gif
 
QUOTE Wie meinst du das?


Genau das ist mein Ziel. Ich habe das auch schon versucht aber das will nicht so richtig.


CODE case "html" || "php" || "asp":
$extpic = "html.jpg";
break;
 
So funktioniert es bei mir.
CODE <?php

$ext = "html";

switch ($ext) {
case "htm": case "html":
$extpic = "htm.jpg";
break;
}

echo $extpic;
?>


Ausgabe:
htm.jpg
 
CODE
<?

function getExtImage($sFilename = "helloworld.jpg") {
$aExtensions = array(
"(php|htm|txt)" => "php.jpg",
"(jpg|gif)" => "jpeg.jpg",
"(jsp)" => "jsp.jpg"
);

foreach ($aExtensions as $sRegexp => $sImage) {
//echo "$sRegexp -> $sImage<br>";
if (preg_match('/'.$sRegexp.'/',$sFilename)) {
return $sImage;
}
}
}

echo getExtImage("something.php") . "<br>";
echo getExtImage("something.jpg") . "<br>";
echo getExtImage("something.jsp") . "<br>";

?>


Gruss
- Steven
Code:
 
QUOTE So funktioniert es bei mir.


Bstens, das funktioniert ja wunderbar.

Vielen Dank

MilkBoy
 
Die Lösung von SwiZZ würde ich persönlich als die beste hiergenannte bezeichnen. Über switch soetwas zu lösen ist einfach zu starr...

Dennoch würde ich bei SwiZZ Lösung berücksichtigen, dass sie so nicht fehlerfrei funktioniert.

zB. echo getExtImage("php-bild.jpg");

gibt php.jpg zurück...

das preg_match sollte ungefähr so aussehen:

CODE if (preg_match('/\.'.$sRegexp.'$/',$sFilename)) {...


hab's net getestet, aber das ganze soll soviel bedeuten wie: nur wenn die Zeichenkette am Ende des Strings vorkommt, und davor ein Punkt ist.
 
Zurück
Oben