rechtstexte für onlineshop
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Performantes Erstellen eines Arrays - wie?

    webald

    • modified Team
    • Beiträge: 2.791
    Performantes Erstellen eines Arrays - wie?
    am: 21. Mai 2015, 09:59:11
    Hallo,

    nehmen wir mal die Tabellen customers, orders und orders_products. Es sol nun ein Array erstellt werden, das mehrere Kunden und deren Bestellungen enthält. Das fertige Array soll in etwa so aussehen:

    Zitat
    array(customers_id => 1, orders => array(orders_id => 101, orders_products => array(orders_products_id => 1001, products_id => 1)))

    Gibt es eigentlich irgendeine Möglichkeit solche Arrys sehr schnell zu erstellen ohne über customers_id bzw. orders_id zu iterieren?

    Linkback: https://www.modified-shop.org/forum/index.php?topic=33014.0
    rechtstexte für onlineshop

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 14.027
    • Geschlecht:
    Re: Performantes Erstellen eines Arrays - wie?
    Antwort #1 am: 23. Mai 2015, 18:47:14
    Verstehe nicht genau was du möchtest, aber evtl. hilft dir array_merge_recursive() ?
    Nach einer DB-Abfrage schreibst du ja ohnehin mittels mysql_fetch_array() oder ähnlichen Funktionen die Query-Ergebnisse in ein Array. Mittels erstgenannter Funktion kannst du dann diverse solcher Arrays in ein einziges schreiben.

    Gruß,
    noRiddle

    hendrik

    • Experte
    • Beiträge: 2.038
    Re: Performantes Erstellen eines Arrays - wie?
    Antwort #2 am: 24. Mai 2015, 10:28:41
    Du kann mit mehrfach verschachteleten Schleifen die DB-Tabellen abfragen.

    Code: PHP  [Auswählen]

      $customers_id_arr = array(123, 124, 125);  // gesuchte Kunden
     
      $result_arr = array();
      foreach( $customers_id_arr as $customers_id ) {  
     
        $orders_arr = array();
        $orders_sql = " select orders_id
                        from "
    .TABLE_ORDERS."
                        where customers_id='$customers_id'
                        order by orders_id asc"
    ;
        $orders_res = xtc_db_query($orders_sql);
        while( $orders_data=xtc_db_fetch_array($orders_res) ) {
          $orders_id = $orders_data['orders_id'];
         
          $orders_products_arr = array();
          $orders_products_sql = "select
                                    orders_products_id,
                                    products_id
                                  from "
    .TABLE_ORDERS_PRODUCTS."
                                  where orders_id='$orders_id'
                                  order by orders_products_id asc"
    ;
          $orders_products_res = xtc_db_query($orders_products_sql);
          while( $orders_products_data=xtc_db_fetch_array($orders_products_res) ) {
            $orders_products_id = $orders_products_data['orders_products_id'];
            $products_id        = $orders_products_data['products_id'];
           
            $orders_products_arr[] = array(
              'orders_products_id'  => $orders_products_id,
              'products_id'         => $products_id
            );
          }
          $orders_arr[] = array(
            'orders_id'         => $orders_id,
            'orders_products'   => $orders_products_arr
          );
           
        }
       
        $result_arr[] = array(
          'customers_id'  => $customers_id,
          'orders'        => $orders_arr  
        );
      }

     

    (aus der freien Hand, nicht getestet)

    Gruß
    hen

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Performantes Erstellen eines Arrays - wie?
    Antwort #3 am: 25. Mai 2015, 10:10:19
    So wie der Hendrik das vorschlägt muss man ja trotzdem mit Schleifen arbeiten und ruft u.U. die Abfrgen für die Details zig-fach auf und erzeugt damit eine permanente Last auf dem SQL-Server. Das ist ja auch die Lösung die mir einfiel, die bedeutet aber bei 100 Kunden mit je 3 Bestellungen und je 5 Artikel/Bestellung am Ende 1 Abfrage für die Kunden 100 Abfragen für die Bestellungen und 100x3 Abfragen für die Artikel. Der SQL-Server muss also 401 Abfragen ausführen um eine relativ kleine Datenmenge zu liefern.

    In .NET würde ich dafür nur 3 Abfragen benötigen, diese in 1 Dataset schreiben und die Tabellen im Dataset verknüpfen und durch die Hierarchien navigieren ohne weiter SQL-Abfrage. Hierarchische Arrays (v.a. deren Erstellung) sind mir in PHP aber nicht über den Weg gelaufen.

    Jetzt würde man natürlich sagen können ich soll nicht alle Daten abrufen, sondern nur den einen Kunden. Das kann aber in meinem Fall zu einer langen Antwortzeit führen.
    Szenario:
    SQL-Server/PHP-Anwendung1 bei Hoster A
    PHP-Anwendung2 bei Hoster B
    PHP-Anwendung2 ruft via REST (PHP-Anwendung1) Daten beim SQL-Server ab.

    Wenn dann für jede Anfrage ein HTTP-Request abgesetzt werden muss, kann das u. U. ewig dauern im o. g. Fall könnten das 400 Anfragen mehr sein. Daher alle Daten auf einmal an PHP-Anwendung2 senden und alle Filter/Such/Sortierungen dort ausführen.

    HHGAG

    • Frisch an Board
    • Beiträge: 61
    Re: Performantes Erstellen eines Arrays - wie?
    Antwort #4 am: 25. Mai 2015, 12:26:41
    Also diese Abfrage bringt doch alle Daten die Du benötigst:
    Code: SQL  [Auswählen]
    SELECT o.customers_id, o.orders_id, op.orders_products_id, op.products_id FROM orders AS o, orders_products AS op WHERE o.orders_id = op.orders_id;
    Wie Du dies dann in PHP widerspiegelst, spielt eigentlich keine Rolle, es gibt diverse Array Funktionen die Dir dabei helfen dieses nach dem gewünschten Prinzip darzustellen.

    HHGAG

    • Frisch an Board
    • Beiträge: 61
    Re: Performantes Erstellen eines Arrays - wie?
    Antwort #5 am: 25. Mai 2015, 12:36:43
    Und das wäre Deine Lösung:
    Code: PHP  [Auswählen]
    $queryResult = xtc_db_query("
            SELECT
                    o.customers_id,
                    o.orders_id,
                    op.orders_products_id,
                    op.products_id
            FROM
                    orders AS o,
                    orders_products AS op
            WHERE
                    o.orders_id = op.orders_id
    "
    );
    $resultStack = array();
    if (xtc_db_num_rows($queryResult)) {
            while ($queryRow = xtc_db_fetch_array($queryResult)) {
                    $resultStack['customers_id'][$queryRow['customers_id']]['orders'][$queryRow['orders_id']]['orders_products'][] = array(
                            'orders_products_id' => $queryRow['orders_products_id'],
                            'products_id' => $queryRow['products_id'],
                    );
            }

            echo '<pre>';
            print_r($resultStack);
            echo '</pre>';
    }
    sieht dann in etwa so aus:
    Zitat
    Array
    (
        [customers_id] => Array
            (
                [16] => Array
                    (
                        [orders] => Array
                            (
                                [400222] => Array
                                    (
                                        [orders_products] => Array
                                            (
                                                [ 0 ] => Array
                                                    (
                                                        [orders_products_id] => 37
                                                        [products_id] => 1543
                                                    )

                                                [1] => Array
                                                    (
                                                        [orders_products_id] => 38
                                                        [products_id] => 1542
                                                    )

    webald

    • modified Team
    • Beiträge: 2.791
    Re: Performantes Erstellen eines Arrays - wie?
    Antwort #6 am: 26. Mai 2015, 08:29:45
    :thumbs: mehr bleibt da nicht zu sagen.
    0 Antworten
    3185 Aufrufe
    14. Dezember 2009, 14:01:52 von Tomcraft
    4 Antworten
    2685 Aufrufe
    03. Februar 2017, 14:06:17 von Bonsai
    3 Antworten
    1567 Aufrufe
    09. September 2018, 09:34:10 von Buggyboy
    5 Antworten
    2757 Aufrufe
    03. Januar 2017, 13:04:36 von Firebird
               
    anything