tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von saftmeister
  • 1 Beitrag von ComFreek
  • 1 Beitrag von saftmeister
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
340
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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-Code:
    $whitelist = array("seite1"=>"directory1""seite2"=>"directory2"usw...."); 
    geprüft habe ich es mit

    PHP-Code:
    if(isset($whitelist["$seite"])) { tu was 
    so jetzt mein Problem, ich fülle das Array jetzt aus der Datenbank in einer while Schleife:

    PHP-Code:
    $whitelist = array($items["seite"] => $items["directory"]); 
    wie Prüfe ich es hier aber ?

    PHP-Code:
    if(isset($whitelist["$seite"])) { tu was 
    funktioniert hier nicht.
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Mach doch mal ein

    PHP-Code:
    var_dump($whitelist); 
    nach dem du das Array mit den Items aus der Datenbank befüllt hast.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    Habs schon hinbekommen

    Hab das Array jetzt so gefüllt:

    PHP-Code:
    $whitelist[$items["seite"]] = $items["directory"]; 
    Danach konnte ich es ganz einfach per foreach auslesen und vergleichen:

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

    echo 
    $directory;


    }

      } 
    Ist es eigentlich sinnvoll beim Seiteninclude mit foreach zu arbeiten ? oder leidet die Performance
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    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.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    Das foreach ist ja nur für das auslesen des Arrays zum Includen, nicht zur Prüfung.

    So sieht das im ganzen aus:

    PHP-Code:
    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-Code:
    $whitelist = array("seite1"=>"directory1""seite2"=>"directory2"usw...."); 
    Demnach habe ich immer meinen Ordner zu meiner passenden Seite.
     

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Dann sollte es doch so etwas schneller gehen:

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    <?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.
    Starfox2007 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  7. #7
    Avatar von ComFreek
    ComFreek ComFreek ist gerade online [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.364
    Blog-Einträge
    4
    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.
    Starfox2007 bedankt sich. 
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Richtig, das isset() ist da evtl. nicht ganz geschickt. Besser wäre empty():

    Code php:
    1
    2
    3
    
    $set = '';
     
    echo !empty($set) ? '$set ist gefüllt' : '$set ist nicht gefüllt';

    Oder man initialisiert es mit null vor:

    Code php:
    1
    2
    3
    
    $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:

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    
    $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 :
    1
    2
    3
    4
    5
    6
    7
    
    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.
    Geändert von saftmeister (04.12.11 um 17:06 Uhr)
    Starfox2007 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  9. #9
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    Ich hab das foreach jetzt auch wieder rausgenommen. Vielen Dank für die Infos
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 29.01.11, 19:32
  2. Antworten: 2
    Letzter Beitrag: 25.12.08, 07:07
  3. Problem: Mehrdimensionales Array
    Von Elmo im Forum PHP
    Antworten: 1
    Letzter Beitrag: 18.11.08, 22:44
  4. Antworten: 5
    Letzter Beitrag: 30.04.07, 15:03
  5. mehrdimensionales Array lösch Problem in DBM
    Von Krypthonas im Forum PHP
    Antworten: 0
    Letzter Beitrag: 30.04.03, 19:53