Mehrdimensionales Array Problem

Starfox2007

Mitglied
Hallöle,

Ich habe ein kleines Problem mit einem mehrdimensionalen Array.

Ich hatte das Array die ganze Zeit von Hand befüllt da sah es so aus:

PHP:
$whitelist = array("seite1"=>"directory1", "seite2"=>"directory2", usw....");

geprüft habe ich es mit

PHP:
if(isset($whitelist["$seite"])) { tu was }

so jetzt mein Problem, ich fülle das Array jetzt aus der Datenbank in einer while Schleife:

PHP:
$whitelist = array($items["seite"] => $items["directory"]);

wie Prüfe ich es hier aber ?

PHP:
if(isset($whitelist["$seite"])) { tu was }

funktioniert hier nicht.
 
Habs schon hinbekommen ;)

Hab das Array jetzt so gefüllt:

PHP:
$whitelist[$items["seite"]] = $items["directory"];

Danach konnte ich es ganz einfach per foreach auslesen und vergleichen:

PHP:
foreach($whitelist as $seite => $directory) {
	
if ($page == $seite) {
	

echo $directory;


}

  }

Ist es eigentlich sinnvoll beim Seiteninclude mit foreach zu arbeiten ? oder leidet die Performance
 
Naja, eigentlich wäre ein foreach nicht notwendig, wenn das Array so aufgebaut ist, das man mit isset() prüfen kann. Daher auch mein Hinweis mit var_dump(). Womöglich befüllst du das Array einfach nicht so, das man mittels isset() einfach prüfen kann.
 
Das foreach ist ja nur für das auslesen des Arrays zum Includen, nicht zur Prüfung.

So sieht das im ganzen aus:

PHP:
if (isset($page) && isset($whitelist["$page"])) { // Wenn Seite gesetzt und das Array der Seite entspricht gehts weiter


foreach($whitelist as $link => $directory) { 
	
if ($page == $link) { // wenn aktuelle Seite gleich der Seite in der Whitelist
	
$file = "./" .$directory. "/" .$link. ".php"; // Pfad der zu inkludierenden Seite in $file speichern

if(file_exists($file)) { include_once $file; }else{ include_once "./content/fehler.php"; } // Wenn Datei existiert Seite includieren, wenn nicht Fehlerseite aufrufen.

}

  }
  
   }else{ // Wenn $page nicht gesetzt oder Whitelist mit $page nicht übereinstimmt dann Fehlerseite aufrufen

if(file_exists("./content/fehler.php")) { include_once "./content/fehler.php"; }else{ die ("Schwerer Fehler aufgetreten"); }

}

Und das Array sieht so aus:

PHP:
$whitelist = array("seite1"=>"directory1", "seite2"=>"directory2", usw....");

Demnach habe ich immer meinen Ordner zu meiner passenden Seite.
 
Dann sollte es doch so etwas schneller gehen:

PHP:
<?php
// Wird mehrmals verwendet
define("ERROR_PAGE", "./content/fehler.php");

// Seite aus dem GET-Parameter page holen
$page = isset($_GET['page']) ? $_GET['page'] : '';

// White-List für die Directories
$whitelist = array("seite1"=>"directory1", "seite2"=>"directory2");

// Vorinitialisierung
$file = ERROR_PAGE;
// Haben wir eine Seite im GET-Parameter und existiert die Seite in der White-List?
if (isset($page) && isset($whitelist["$page"])) {
	// Wenn Seite gesetzt und das Array der Seite entspricht gehts weiter
	$file = "./" .$whitelist["$page"]. "/" .$page. ".php"; // Pfad der zu inkludierenden Seite in $file speichern
}

// Nur zum Debuggen
//echo $file;

// Existiert die Datei?
if(!file_exists($file))
	$file = ERROR_PAGE;

// Datei einbinden...
include_once $file;

Also das foreach wird nicht benötigt.
 
Noch zwei rein stilistische Anmerkungen:


  • isset($page) im IF wird nicht benötigt, da $page immer gesetzt wird, entweder mit $_GET['page'] oder einem leeren String.


  • Bei den ["$page"] kann man die Anführungsstriche ganz weglassen.
 
Richtig, das isset() ist da evtl. nicht ganz geschickt. Besser wäre empty():

PHP:
$set = '';

echo !empty($set) ? '$set ist gefüllt' : '$set ist nicht gefüllt';

Oder man initialisiert es mit null vor:

PHP:
$set = null;

echo isset($set) ? '$set ist gesetzt' : '$set ist nicht gesetzt';

Edit: Das kann ich ja jetzt gar nicht glauben: Die Prüfung, ob ein Element im Array vorkommt, geht teilweise schneller, als die Prüfung, ob eine Variable gesetzt ist oder nicht... Folgender Code:

PHP:
$s1 = microtime(true);
isset($page);
$s2 = microtime(true);
isset($whitelist[$page]);
$e = microtime(true);

echo 'isset($page)-Pruefung dauert ' . sprintf("%1.10f", ($s2 - $s1)) . "<br/>";
echo 'isset($whitelist[$page])-Pruefung dauert ' . sprintf("%1.10f", ($e - $s2)) . "<br/>";

Ergebnis:
Code:
Testlauf 1:
isset($page)-Pruefung dauert 0.0000090599
isset($whitelist[$page])-Pruefung dauert 0.0000081062

Testlauf 2:
isset($page)-Pruefung dauert 0.0000028610
isset($whitelist[$page])-Pruefung dauert 0.0000030994

Hat da jemand eine Erklärung für? Hat mich jetzt einfach mal interessiert, das Ergebnis hätte ich so aber nicht erwartet.

EDIT2: Erklärung für mich selbst: Intern bildet PHP alles, was sich im Speicher befindet, als Hash-Table-Element ab. Daher kann es auch vorkommen, das eine isset-Prüfung auf ein Array-Element schneller, genauso schnell oder langsamer ist als die Prüfung einer regulären Variable.
 
Zuletzt bearbeitet:
Zurück