Ankündigung

Einklappen
Keine Ankündigung bisher.

assoziatives Array erweitern

Einklappen

Neue Werbung 2019

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

  • assoziatives Array erweitern

    Hallo,

    ich habe folgendes Problem.

    Ich frage ein Array aus einer SQL DB ab und erhalte folgendes Ergebnis.

    HTML-Code:
    Array
    (
        [0] => Array
            (
                [order_total_id] => 14729
                [0] => 14729
                [order_id] => 3602
                [1] => 3602
                [code] => sub_total
                [2] => sub_total
                [title] => Zwischensumme
                [3] => Zwischensumme
                [value] => 78.5000
                [4] => 78.5000
                [sort_order] => 1
                [5] => 1
            )
    
        [1] => Array
            (
                [order_total_id] => 14730
                [0] => 14730
                [order_id] => 3602
                [1] => 3602
                [code] => total
                [2] => total
                [title] => Summe
                [3] => Summe
                [value] => 78.5000
                [4] => 78.5000
                [sort_order] => 9
                [5] => 9
            )
    
    )
    die Netto und Bruttowerte der Rechnung sind vorhanden aber bei manchen Rechnungen fehlen noch die MwSt.

    Dies ist auch soweit in Ordnung weil der Artikel ohne MwSt angelegt ist.

    Deswegen möchte ich die hinzufügen:

    PHP-Code:
    $allResults3[] = array('order_total_id'=>'0000','order_id'=>$aktuellerwert,'code'=>'tax','title'=>'Mehrwertsteuer 7%','value'=>0,'sort_order'=>5); 
    danach klappt aber das sortieren zum Beispiel nicht mehr, was vorher geklappt hat:
    PHP-Code:
     function sortBy($field, &$array$direction 'asc')
    {
        
    usort($arraycreate_function('$a, $b''
            $a = $a["' 
    $field '"];
            $b = $b["' 
    $field '"];

            if ($a == $b) return 0;

            $direction = strtolower(trim($direction));

            return ($a ' 
    . ($direction == 'desc' '>' '<') .' $b) ? -1 : 1;
        '
    ));

        return 
    true;
    }     
    sortBy('sort_order'$allResults3); 
    die zweite Frage die ich mir stelle, wie kann ich einem Array einen assoziativen Schlüssel mitgeben und auch den fortlaufenden Schlüssel [0][1]

    Was mache ich bei dem hinzufügen zu dem Array falsch?

    Vielen Dank
    Thomas

  • #2
    die Netto und Bruttowerte der Rechnung sind vorhanden aber bei manchen Rechnungen fehlen noch die MwSt.
    Wenn das bei manchen der Fall ist, zeig uns doch bitte beide Fälle. Dann wissen wir auch wo du eigentlich hin willst

    $allResults3[]
    Variablen durchnummerieren ist oftmals ein Zeichen von schlechtem bzw. falschem Design.

    wie kann ich einem Array einen assoziativen Schlüssel mitgeben und auch den fortlaufenden Schlüssel [0][1]
    Garnicht, du musst die Sachen zweimal speichern wenn du beide Varianten haben willst. Grundsätzlich ist das aber meistens quatsch. Dein Ergebnis aus der Datenbank hat beide Varianten, weil das von dir so eingestellt ist. http://php.net/manual/de/mysqli-result.fetch-all.php
    Unter resulttype siehst du, wie du das ändern kannst.

    sortieren
    Das kann deine Datenbank in der Regel bedeutend besser (schneller) als du es mit Php hinbekommen wirst, vermutlich empfiehlt es sich die Sortierung mit SQL zu machen.

    Kommentar


    • #3
      Grundlegend geht es darum, dass aus einem Shop bestimmte Rechnungen nicht korrekt erstellt werden weil auf deutschen Konzertkarten 7% MwSt anfallen und auf die VVK 19%. Ich weiß das es dafür andere Lösungen und Wege gibt aber ich bin an sich schon fertig wenn ich dieses neue Array vernünftig ansprechen könnte.

      Das wäre ein Beispiel für eine vollständige Rechnung wie sie aus der DB kommt. Je nachdem welche Steuern erhoben worden sind oder ob Porto angefallen ist, sind aber halt nicht alle Werte vorhanden. Zu den Summen und MwSt muss ich danach manuell werte addieren.

      Das Array frage ich so ab:

      PHP-Code:
      if(isset($_POST['submit']))
      {
         
      $sql3$pdo->prepare("SELECT * FROM bb_order_total WHERE order_id = :aktuellerwert");
        
      $sql3->bindParam(':aktuellerwert'$aktuellerwert);
        
      $aktuellerwert $_POST['txtOut'];
        
      $sql3->execute();
        
      $allResults3 $sql3->fetchAll();               
                   } 
      HTML-Code:
      Array
      (
          [0] => Array
              (
                  [order_total_id] => 14737
                  [0] => 14737
                  [order_id] => 3606
                  [1] => 3606
                  [code] => sub_total
                  [2] => sub_total
                  [title] => Zwischensumme
                  [3] => Zwischensumme
                  [value] => 87.8379
                  [4] => 87.8379
                  [sort_order] => 1
                  [5] => 1
              )
      
          [1] => Array
              (
                  [order_total_id] => 14738
                  [0] => 14738
                  [order_id] => 3606
                  [1] => 3606
                  [code] => shipping
                  [2] => shipping
                  [title] => Deutschland
                  [3] => Deutschland
                  [value] => 3.2689
                  [4] => 3.2689
                  [sort_order] => 3
                  [5] => 3
              )
      
          [2] => Array
              (
                  [order_total_id] => 14740
                  [0] => 14740
                  [order_id] => 3606
                  [1] => 3606
                  [code] => tax
                  [2] => tax
                  [title] => Mehrwertsteuer 7%
                  [3] => Mehrwertsteuer 7%
                  [value] => 0.0654
                  [4] => 0.0654
                  [sort_order] => 5
                  [5] => 5
              )
      
          [3] => Array
              (
                  [order_total_id] => 14739
                  [0] => 14739
                  [order_id] => 3606
                  [1] => 3606
                  [code] => tax
                  [2] => tax
                  [title] => Mehrwertsteuer 19%
                  [3] => Mehrwertsteuer 19%
                  [value] => 2.2177
                  [4] => 2.2177
                  [sort_order] => 5
                  [5] => 5
              )
      
          [4] => Array
              (
                  [order_total_id] => 14741
                  [0] => 14741
                  [order_id] => 3606
                  [1] => 3606
                  [code] => total
                  [2] => total
                  [title] => Summe
                  [3] => Summe
                  [value] => 93.3899
                  [4] => 93.3899
                  [sort_order] => 9
                  [5] => 9
              )
      
      )
      http://php.net/manual/de/mysqli-result.fetch-all.php
      Unter resulttype siehst du, wie du das ändern kannst.
      dafür schon mal vielen Dank!

      Dann bleibt für mich die Frage warum ich die Daten die aus der DB kommen durch die Funktion ansprechen kann, sobald ich aber das Array erweitere es nicht mehr klappt.
      In der SQL DB gibt es die Einträge ja noch nicht deswegen könnte ich Sie da auch nicht sortieren und ich schreibe auch keine Werte zurück in die DB.

      Kommentar


      • #4
        Ich check hier gar nichts.

        Deswegen möchte ich die hinzufügen:
        Dann packst du die mit als Rechnungsposition in die Datenbank. Die Geschäftslogik hätte das an der Stelle schon längst machen sollen, anstatt jetzt hinterher reinzupfuschen. Warum sollte man bestehende Rechnungen im Nachhinein ändern? Ist das überhaupt legal?

        danach klappt aber das sortieren zum Beispiel nicht mehr,
        Dann klappt's halt auch wieder mit der DB.

        Das wäre ein Beispiel für eine vollständige Rechnung wie sie aus der DB kommt.
        Nein, eben nicht.

        Die Funktion musst du sonst mal Stück für Stück durchgehen und dir alle Zwischenergebnisse ausgeben lassen. Das geht mittlerweile aber auch schöner und übersichtlicher

        PHP-Code:
        <?php

        $allResults3
        [] = array('order_total_id'=>'0000','order_id'=>3,'code'=>'tax','title'=>'7%','value'=>0,'sort_order'=>5);
        $allResults3[] = array('order_total_id'=>'0001','order_id'=>1,'code'=>'nix','title'=>'foo','value'=>123,'sort_order'=>1);
        $allResults3[] = array('order_total_id'=>'0002','order_id'=>2,'code'=>'mix','title'=>'bar','value'=>234,'sort_order'=>2);

        $sorter = function($field$direction){
            return function(
        $a$b) use ($field$direction){
                return 
        $direction == 'asc' $a[$field] <=> $b[$field] : $b[$field] <=> $a[$field] ;
            };
        };

        usort($allResults3$sorter('sort_order''desc'));

        print_r($allResults3);
        Zur eigenen Recherche: Closures, Currying, PHP 7
        [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

        Kommentar

        Lädt...
        X