DanTheMan: JSON DB Daten extrahieren

Hallo,

ich habe hier eine JSON Datenbank (oder Datenbankauszug) als Arrays. Die Blöcke der Einträge sehen aus wie folgt:

{
  "id" : ******,
  "created" : ******,
  "storeAccountId" : 1****9,
  "userIp" : "*******",
  "transactionId" : "EUW1-21",
  "transactionNumber" : "LW6G8******",
  "currencyType" : "EUR",
  "paymentType" : "Sofort",
  "amount" : 20.0,
  "success" : true,
  "imported" : false
},

Ich möchte nun den Amount-Wert aller Einträge summieren, um den Gesamtbetrag zu erhalten. Danke im Voraus 😀

  1. In PHP:

    $array = json_decode( (file_get_contents ( '/foo/bar.json' ) ) );
    
    $sum = 0;
    foreach ( $array as $tupel ) {
        $sum += $tupel['amount'];
    }
    
    echo 'Summe: ' . $sum . PHP_EOL;
    

    In Worten:

    Du liest Deine Daten in ein Array, iterierst über die Elemente (die Tupel sind) und summierst hierbei den Wert der gewünschten Eigenschaft oder Spalte zur Gesamtsumme.

    Das geht in praktisch jeder auch nur halbwegs modernen Pogrammiersprache so wie oben gezeigt.

    1. Fatal error: Uncaught Error: Cannot use object of type stdClass as array in C:\Apache\htdocs\index1.php:8 Stack trace: #0 {main} thrown in C:\Apache\htdocs\index1.php on line 8

      Line 8:

      $sum += $tupel['amount'];

      Danke nochmal :)

      1. Fatal error: Uncaught Error: Cannot use object of type stdClass as array in C:\Apache\htdocs\index1.php:8 Stack trace: #0 {main} thrown in C:\Apache\htdocs\index1.php on line 8

        Line 8:

        $sum += $tupel['amount'];

        Danke nochmal :)

        Zeig mal statt dessen ($sum += $tupel['amount'];) mit

        print '<pre>'; print_r( $tupel ); exit;
        

        her, was Du da hast.

        1. selbes, auch mit var_dump()

          1. Ach ja. In PHP muss man in der Funktion json_decode() den zweiten Parameter "assoc" auf true setzen, damit ein assoziativer Array (was man meist braucht!) herauskommt:

            Also:

            $array = json_decode( $json, true );
            

            Vollständig:

            <?php
            
            $foo["id"]				= "******";
            $foo["created"] 		= "******";
            $foo["storeAccountId"] 	= "1****9";
            $foo["userIp"]			= "*******";
            $foo["transactionId"] 	= "EUW1-21";
            $foo["transactionNumber"] = "LW6G8******";
            $foo["currencyType"]	= "EUR";
            $foo["paymentType"]		= "Sofort";
            $foo["amount"]			= 20.0;
            $foo["success"]			= true;
            $foo["imported"]		= false;
            
            $bar[] = $foo;
            $bar[] = $foo;
            
            $s= json_encode ( $bar,  JSON_PRETTY_PRINT );
            
            echo "\n--------------------------------------------------\n";
            echo '$s=' . $s;
            echo "\n--------------------------------------------------\n";
            
            $array = json_decode($s, true);
            
            echo "\n--------------------------------------------------\n";
            echo '$array='; print_r( $array);
            echo "\n--------------------------------------------------\n";
            echo json_last_error_msg();
            echo "\n--------------------------------------------------\n";
            $sum = 0;
            foreach ( $array as $tupel ) {
                $sum += $tupel['amount'];
            }
            echo "\n--------------------------------------------------\n";
            echo 'Summe: ' . $sum . PHP_EOL;
            

            Ausgaben:

            php test.php 
            
            --------------------------------------------------
            $s=[
                {
                    "id": "******",
                    "created": "******",
                    "storeAccountId": "1****9",
                    "userIp": "*******",
                    "transactionId": "EUW1-21",
                    "transactionNumber": "LW6G8******",
                    "currencyType": "EUR",
                    "paymentType": "Sofort",
                    "amount": 20,
                    "success": true,
                    "imported": false
                },
                {
                    "id": "******",
                    "created": "******",
                    "storeAccountId": "1****9",
                    "userIp": "*******",
                    "transactionId": "EUW1-21",
                    "transactionNumber": "LW6G8******",
                    "currencyType": "EUR",
                    "paymentType": "Sofort",
                    "amount": 20,
                    "success": true,
                    "imported": false
                }
            ]
            --------------------------------------------------
            
            --------------------------------------------------
            $array=Array
            (
                [0] => Array
                    (
                        [id] => ******
                        [created] => ******
                        [storeAccountId] => 1****9
                        [userIp] => *******
                        [transactionId] => EUW1-21
                        [transactionNumber] => LW6G8******
                        [currencyType] => EUR
                        [paymentType] => Sofort
                        [amount] => 20
                        [success] => 1
                        [imported] => 
                    )
            
                [1] => Array
                    (
                        [id] => ******
                        [created] => ******
                        [storeAccountId] => 1****9
                        [userIp] => *******
                        [transactionId] => EUW1-21
                        [transactionNumber] => LW6G8******
                        [currencyType] => EUR
                        [paymentType] => Sofort
                        [amount] => 20
                        [success] => 1
                        [imported] => 
                    )
            
            )
            
            --------------------------------------------------
            No error
            --------------------------------------------------
            
            --------------------------------------------------
            Summe: 40
            
            1. Hi,

              die JSON-Datei beinhaltet ca. 900 dieser Datensätze, wie stell ich das dann an?

              LG 😀

              1. die JSON-Datei beinhaltet ca. 900 dieser Datensätze, wie stell ich das dann an?

                Genau so. Nur eben den Teil weglassen, in welchem ich das JSON für den Test erstmal erzeugte. Bleibt:

                <?php
                $array = json_decode( ( file_get_contents( '/foo/bar.json' ) ), true );
                
                if ( json_last_error() )  {
                   header ( 'Content-Type: test/plain; charset=utf-8' );
                   echo json_last_error_msg() . PHP_EOL;
                   exit;
                }
                
                $sum = 0;
                foreach ( $array as $tupel ) {
                    $sum += $tupel['amount'];
                }
                
                echo 'Summe: ' . $sum . PHP_EOL;
                

                Das sollte bei nur 900 Datensätzen in ein paar Millisekunden erledigt sein.