Ankündigung

Einklappen
Keine Ankündigung bisher.

Möglichkleit ein "key-value" per ID zu gruppieren, in einem multi. Array?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Möglichkleit ein "key-value" per ID zu gruppieren, in einem multi. Array?

    Gibt es eine Möglichkleit ein "key-value store" per ID zu gruppieren in einem multidimensionalen Array?

    SQL Tabellen:
    Code:
        Tabelle 1: App
        ID | Name      | Release
        1  | TinyWings | 2014
        2  | WarCraft  | 2012
        3  | StarCraft | 1998
    
        Tabelle 2: AppInfo
        ID | Key       | Value
        1  | Genre     | Casual
        1  | Rating    | 0+
        1  | System    | iOS
        ...
        2  | Genre     | RTS
        2  | Rating    | 6+
        2  | System    | Win
        ...
        3  | Genre     | RTS
        3  | Rating    | 12+
        3  | System    | Win
        ...
    Für die Profilseite der App verwende ich:
    Code:
        $app = $statement->fetchAll(PDO::FETCH_KEY_PAIR);
    aber auf der index.php benötige ich ein array das so aussieht:
    Code:
        Array (
            [0]=> Array (
                      [Genre]=>[Casual]
                      [Rating]=>[0+]
                      [System]=>[iOS]
                      ...)
            [1]=> Array (
                      [Genre]=>[RTS]
                      [Rating]=>[6+]
                      [System]=>[Win]
                      ...)
            [2]=> Array (
                      [Genre]=>[RTS]
                      [Rating]=>[12+]
                      [System]=>[Win]
                      ...)
        )
    die einzige Möglichkeit die ich gefunden habe ist die Spalten per:
    Code:
        MAX(CASE WHEN ... THEN .. END) AS ...
    in eine Zeile zu schreiben und dann das ganze per:
    Code:
        fetchAll(PDO::FETCH_ASSOC)
    auszugeben.
    Leider muss dabei für jeden KEY in der Tabelle AppInfo eine
    Code:
        MAX(CASE WHEN ... THEN .. END) AS ...
    Klausel existieren.
    Gibt es eine einfachere Möglichkeit die das Ergebnis per:
    Code:
        PDO::FETCH_KEY_PAIR
    per ID zu Gruppieren? oder einen anderen alternativen Weg?

  • #2
    was spricht hiergegen

    PHP-Code:

    $result 
    = [];
    $sql "SELECT ID as appId,key,value FROM AppInfo";
    $statement $pdo->query($sql);

    while (
    $row $statement->fetch(PDO::FETCH_KEY_PAIR)) {
        
    $result[$row->appId][$row->key] = $row->value;
    }
    $result array_values($result);
    var_dump($result); 
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

    Kommentar


    • #3
      PDO::FETCH_KEY_PAIR kann nur 2 Spalten von einer SQL Query abrufen
      Code:
      $sql = "SELECT key, value FROM AppInfo";
      und bei deinem Beispiel BlackScorp würde man vor der eigentlichen Ausgabe 2 Schleifen benötigen, einmal while für die Erstellung der Arrays und die zweite (foreach) für die Ausgabe.

      Kommentar


      • #4
        Du könntest es mit einem Join machen, Sortieren nach der AppId und dann ein Gruppenbruch https://php-de.github.io/jumpto/gruppenbruch/ machen in der Ausgabe.
        Allerdings sehe ich das große Problem bei BlackScorp Lösung nicht, ich glaube bis du Daten ausgibst, welche deine Seite merklich durch zwei Schleifen verlangsamt, muss schon einiges zusammen kommen.

        Kommentar


        • #5
          Wenn sich die Anzahl der Elemente pro Gruppe fest ist und sich auf 2-3 beschränkt ist das noch mit Joins zu machen, sonst wird es anstrengend.
          Habe gute Erfahrungen gemacht das für SQLite + MySQL per Pivot zu machen. PostgreSQL hat da noch bessere Möglichkeiten.

          MySQL: Gruppieren und Gruppenelemente mit in der Zeile ausgeben

          Kommentar


          • #6
            Zitat von jspit Beitrag anzeigen
            Wenn sich die Anzahl der Elemente pro Gruppe fest ist und sich auf 2-3 beschränkt ist das noch mit Joins zu machen, sonst wird es anstrengend.
            Habe gute Erfahrungen gemacht das für SQLite + MySQL per Pivot zu machen. PostgreSQL hat da noch bessere Möglichkeiten.

            MySQL: Gruppieren und Gruppenelemente mit in der Zeile ausgeben
            Im Übrigen ist Mongo DB am besten geeignet für Key Value Storages.. man kann auch Redis nehmen oder auch Elastic Stack, damit hat man auch gleich die Suche erschlagen. Ich hoffe du hörst hier die Ironie
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

            Kommentar


            • #7
              Ist zwar nicht gefragt, dies per PHP zu gruppieren ist ja auch nicht so schwer wenn das Resultat nicht unbedingt mit einem fetschall abrufbar sein soll:
              PHP-Code:
              $options = array(
                
              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                
              PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
              );
              $db = new PDO($dsn$user$password$options);  

              $stmt $db->query("SELECT id,`key`,value FROM AppInfo");

              //gruppieren -> $dataPairs
              $dataPairs = array();

              foreach(
              $stmt as $row){
                
              $dataPairs[$row->id][$row->key] = $row->value;

              Kommentar

              Lädt...
              X