jannnfe: Daten aus einem multidimensionalen Array mithilfe von $_GET holen

Hallo, ich studiere zur Zeit Medieninformatik und habe ein Projekt. Meine erste eigene Homepage erstellen. Nun hänge ich an einem Problem, was mich schon mehrere Stunden gekostet hat. Im Netz finde ich nicht wirklich eine Antwort.

Und zwar möchte ich mithilfe von $_GET herausfinden auf welcher Seite ich mich befinde und aus folgendem Array dann zum Beispiel den "title" der Seite ausgeben.

Array mit allen Seiteninformationen:

$data = array(
        "home" => array(
            "id" => 0,
            "path" => "home",
            "lang" => "de",
            "title" => "Home",
            "description" => "Startseite",
            "keywords" => "home, startseite",
            "author" => "Autor",
            "content" => "home.php",
            "subpages"),
        "news" => array(
            "path" => "newnews",
            "title" => "News",
            "subpages" => array(
                "newnews" => array(
                    "id" => 1,
                    "path" => "newnews",
                    "lang" => "de",
                    "title" => "Neusten News",
                    "description" => "Neusten News",
                    "keywords" => "news, newnews, neusten news",
                    "author" => "Autor",
                    "content" => "newnews.php")
            )
        ),
        "reviews" => array(
            "path" => "newreviews",
            "title" => "Reviews",
            "subpages" => array(
                "newreviews" => array(
                    "id" => 4,
                    "path" => "newreviews",
                    "lang" => "de",
                    "title" => "Neusten Reviews",
                    "description" => "Neusten Reviews",
                    "keywords" => "review, reviews, newreviews, neusten reviews",
                    "author" => "Autor",
                    "content" => "newreviews.php")
            )
        )
    );

Als Abfrage, auf welcher Seite ich mich gerade befinde, benutze ich folgenden Code, der aus meiner Linkstruktur - <a href="index.php?page=impressum">Impressum</a> - den Parameter page abfragt:

    if(isset($_GET["page"])){
        $page = $_GET["page"];
        if(array_key_exists($page, $data)){
            $page = $_GET["page"];
        }
        else{ $page = "home"; }
    }
    else{ $page = "home"; }

Auf die Daten im Array der Seite "home" kann ich so zugreifen:

    function getTitle(){
        global $data, $page;
        echo $data[$page]["title"];
    }

Jedoch geht das nicht mehr mit der Seite "news" / "newnews" im Array. Ich bekomme aus irgendwelchen Gründen einfach keine gescheite Lösung, dass die Funktion getTitle(); mir am Ende auch die Titel meiner subpages ausgibt. Ich müsste also noch zwei Arraystrukturen weiter nach unten wandern. Wie mache ich das?

Danke und MfG

akzeptierte Antworten

  1. Hallo jannnfe,

    Ich würde die Struktur des Arrays durchlaufen, etwa so:

    function getTitle() {
      global $data, $page;
      // wenn get page gesetzt ist, nimm es. Sonst nimm "home"
      $page =( isset( $_GET["page"] )) ? $_GET["page"] : "home";
    
      foreach ( $data AS $ebene_1 ) { // "home", "news", ...
        if ( $ebene_1 == $page ) return $data[$ebene_1]["title"]; // Titel Ebene 1 und weg
        foreach ( $ebene_1 AS $ebene_2 ) { // keine Treffer möglich
          foreach ( $ebene_2 AS $ebene_3 ) {  // "newnews", ...
            if ( $ebene_3 == $page ) return $data[$ebene_1][$ebene_2][$ebene_3]["title"]; // Titel Ebene 3 und weg
          }
        }
      }
      return FALSE;  // nichtmal "home" gefunden
    }
    

    Nicht getestet, der Vergleich if ( $ebene_1 (Array) == $page (String) ) kann nicht funktionieren. Aber das Prinzip ...

    Linuchs

    1. Danke für deine Mühe Linuchs, hatte gestern damit herumexperimentiert, bin nur leider auch zu keinem Abschluss gekommen.

      Heute morgen habe ich es dann so hinbekomme. Sieht bestimmt nicht elegant aus und gibt eine bessere Variante aber für mich der seit paar Wochen php lernt ganz Inordnung.

          $data = array(
              "home" => array(
                  "id" => 0,
                  "path" => "home",
                  "lang" => "de",
                  "title" => "Home",
                  "description" => "Startseite",
                  "keywords" => "home, startseite",
                  "author" => "Jan Feiler",
                  "content" => "home.php",
                  "subpages"),
              "news" => array(
                  "path" => "newnews",
                  "title" => "News",
                  "subpages" => $subNews = array(
                      "newnews" => array(
                          "id" => 1,
                          "path" => "newnews",
                          "lang" => "de",
                          "title" => "Neusten News",
                          "description" => "Neusten News",
                          "keywords" => "news, newnews, neusten news",
                          "author" => "Jan Feiler",
                          "content" => "newnews.php"),
                      "musicnews" => array(
                          "id" => 2,
                          "path" => "musicnews",
                          "lang" => "de",
                          "title" => "Musik News",
                          "description" => "Musik News",
                          "keywords" => "news, musicnews, musik news",
                          "author" => "Jan Feiler",
                          "content" => "musicnews.php"),
                      "artistnews" => array(
                          "id" => 3,
                          "path" => "artistnews",
                          "lang" => "de",
                          "title" => "Artist News",
                          "description" => "Artist News",
                          "keywords" => "news, artistnews, artist news",
                          "author" => "Jan Feiler",
                          "content" => "artistnews.php")
                  )
              )
          );
      
      

      Habe der "subpage" einfach eine neue Variable mit Array drin übergeben und rufe nun vor jedem Abfragen diese Variable ab:

          function getInfos(&$suchVariable, $suchWert){
              global $data, $subNews, $subReviews, $subMusic;
              
              if(isset($_GET["page"])){
                  $page = $_GET["page"];
                  if(array_key_exists($page, $data)){
                      $suchVariable = $data[$page][$suchWert];
                  }
                  else{
                      if(array_key_exists($page, $subNews)){
                          $suchVariable = $subNews[$page][$suchWert];
                      }
                      else{
                          if(array_key_exists($page, $subReviews)){
                              $suchVariable = $subReviews[$page][$suchWert];
                          }
                          else{
                              if(array_key_exists($page, $subMusic)){
                                  $suchVariable = $subMusic[$page][$suchWert];
                              }
                              else $suchVariable = $data["home"][$suchWert];
                          }
                      }
                  }
              }
              else $infoVar = $data["home"][$infoString];
          }
      

      Und den endgültigen Titel der Seite füge ich so in HTML ein:

          function getTitle(){
              getInfos($title, "title");
              echo $title;
          }
      

      Wenn jemand einen Vorschlag hat, das ganze kompakter zu gestalten, würde ich mich über eine Antwort freuen. MfG

      1. Hallo jannnfe,

        irgendwie ist es schräg, was Du machst. Offenbar hast deine Site eine hierarchische Struktur, mit Ordnern wie home und news, und darin liegen php Dateien für die einzelnen Seiten. Diese Hierarchie findet sich auch in deiner Sitemap wieder. Nicht aber in deinem $page Parameter, sondern der enthält offenbar nur den Namen der Subpage.

        Mein Vorschlag wäre, dass Du auf den Page-Parameter verzichtest und dir $_SERVER['PHP_SELF'] anschaust. Wenn Du die Seite "www.jannnfe.test/news/musicnews.php" aufrufst, steht da "/news/musicnews.php" drin. Das musst Du explodieren in die Pfadbestandteile und vom letzten Teil wirfst Du das '.php' weg. Dann bekommst Du ein Array(0=>'news', 1=>'musicnews').

        Damit steigst Du dann in deine Sitemap ein und läufst rekursiv hindurch. Die eigentliche Suchfunktion sollte auch gar nicht wissen, dass Du einen Titel willst, denn du hast ja noch mehr in deinen Info-Blöcken und daher ist es besser, eine getPageInfo Funktion zu bauen, sich davon die Seiteninfos liefern zu lassen und den Titel da heraus zu holen.

        Du kannst natürlich auch bei deinem $page Parameter bleiben und den konstant durch die Aufrufe von getPageInfo schleifen.

        $myName = $_SERVER['PHP_SELF'];
        if (substr($myName, -4) == '.php')
           $myName = substr($myName, 0, -4);
        
        // Am / zerlegen, aber einleitendes / ignorieren (gibt sonst leeren Pfadteil)
        $pfad = explode('/', ltrim($myName, '/'));
        
        $pageInfo = getPageInfo($pfad, $data);
        
        if ($pageInfo == null)
        	echo "Kein Titel gefunden für $myName\n";
        else
           echo "Titel für $myName ist {$pageInfo['title']}\n";
        
        // Suche Seiten-Info zum Pfad. SiteMap als Referenz übergeben, weil PHP sonst kopiert
        function getPageInfo($path, &$siteMap) 
        {
           $firstStep = $path[0];
           
           // SiteMap ist kein Array oder Pfad-Schritt nicht in der SiteMap enthalten -> null zurückgeben
           // Auch für Zuweisung an $node Referenz verwenden!
           if (is_array($siteMap)) 
        		$node = &$siteMap[$firstStep];
        
        	// $siteMap war kein Array oder enthielt den Pfadschritt nicht -> exitus
        	if ($node == null) return null;
           
           // Wir sind am Ende des Pfades -> Diesen Knoten der SiteMap zurückgeben
           if (count($path) == 1)
              return $node;
        
           // Ansonsten weiter mit dem Rest des Pfades und den Subpages dieses Knotens
           return getPageInfo(array_slice($path, 1), $node["subpages"]);
        }
        

        Ich möchte zum Schluss anmerken, dass das Ganze nach Klassen und Objekten schreit, aber da Du noch einsteigst, ist es sicher besser wenn du nicht gleich bis Oberkante Nasenspitze in die Materie eintauchst.

        Gruß Rolf