Home > OS >  How to get the values ​of a JSON?
How to get the values ​of a JSON?

Time:09-05

I have three sample JSON file that I need to loop through. I was able to do two of them already, but the third one is missing. The idea is to go through it using the same logic as the first two.

Example 1 (Sales header)

Controller

$data1 = '[{
      "T": {
          "HD": {
              "HD01": "1",
              "HD06": "20201006033942",
              "HD08": "3736803"
              }
          }
      },
      {
      "T": {
          "HD": {
              "HD01": "2",
              "HD06": "20201006035419",
              "HD08": "7523658"
              }
          }
      }]';

    $json = json_decode($data1, true);

    $head = collect($json)->map(function ($value) {
      return $value["T"]["HD"];
    });

    return view('dashboard.book.index', [
          'head' => $head
    ]);

Blade

 <table >
        <tr>
            <td> HD01</td>
            <td> HD02</td>
            <td> HD03</td>
            <td> HD04</td>
            <td> HD05</td>
            <td> HD06</td>
        </tr>
        @foreach ($head as $value)
            <tr>
                <td>{{ $value['HD01'] }}</td>
                <td>{{ $value['HD02'] ​​}}</td>
                <td>{{ $value['HD03'] }}</td>
                <td>{{ $value['HD04'] }}</td>
                <td>{{ $value['HD05'] }}</td>
                <td>{{ $value['HD06'] }}</td>
            </tr>
           
        @endforeach
    </table>

Result

Header

Example 2 (Detail of sale)

Controller

$data2 = '[{
    "T": {
      "SIEL" : {
              "SIE" : [
                  {
                      "sequenceNumber" : 0,
                      "itemId" : "3010",
                      "itemDescription" : "BAN VACCINE COSTELLET",
                      "unitAmount" : 29950,
                      "quantity" : 1,405,
                      "subTotalAmount" : 42080,
                      "discountAmount" : 0,
                      "totalAmount" : 42080
                     
                  },
                  {
                      "sequenceNumber" : 1,
                      "itemId" : "1010",
                      "itemDescription" : "CROLETA COOKIE",
                      "unitAmount" : 4800,
                      "quantity" : 0.605,
                      "subTotalAmount" : 2904,
                      "discountAmount" : 0,
                      "totalAmount" : 2904
                  }
              ]
          }
      }
      
  },
  {
  "T": {
    "SIEL" : {
            "SIE" : [
                {
                    "sequenceNumber" : 0,
                    "itemId" : "3010",
                    "itemDescription" : "BAN VACCINE COSTELLET",
                    "unitAmount" : 29950,
                    "quantity" : 1,405,
                    "subTotalAmount" : 42080,
                    "discountAmount" : 0,
                    "totalAmount" : 42080
                   
                },
                {
                    "sequenceNumber" : 1,
                    "itemId" : "1010",
                    "itemDescription" : "CROLETA COOKIE",
                    "unitAmount" : 4800,
                    "quantity" : 0.605,
                    "subTotalAmount" : 2904,
                    "discountAmount" : 0,
                    "totalAmount" : 2904
                }
            ]
        }
    }
    
}
  ]';


    $json = json_decode($data2, true);

    $details = collect($json)->map(function ($value) {
      return $value["T"]["SIEL"]["SIE"];
    });

     return view('dashboard.book.index', [
         'details' => $details
      ]);

Blade

 <table >
        <tr>            
            <td> sequenceNumber</td>
            <td> itemId</td>
            <td> itemDescription</td>
            <td> unitAmount</td>
            <td> quantity</td>
            <td> subTotalAmount</td>
            <td> discountAmount </td>
            <td> totalAmount </td>
        </tr>

        @foreach ($details as $items)
            @foreach ($items as $key => $value)
                <tr>                    
                    <td>{{ $value['sequenceNumber'] }}</td>
                    <td>{{ $value['itemId'] }}</td>
                    <td>{{ $value['itemDescription'] }}</td>
                    <td>{{ $value['unitAmount'] }}</td>
                    <td>{{ $value['quantity'] }}</td>
                    <td>{{ $value['subTotalAmount'] }}</td>
                    <td>{{ $value['discountAmount'] }}</td>
                    <td>{{ $value['totalAmount'] }}</td>
                </tr>
            @endforeach
        @endforeach
    </table>    

Result

Details

Example 3 (Header more detail)

 $data3 = '[
    {
       "T":{
          "HD":{
             "HD01":"1",
             "HD02":"20201007",
             "HD03":"1001",
             "HD04":"15",
             "HD05":140,
             "HD06":"20201007062511",
             "HD07":"",
             "HD08":"3514401",
             "HD09":"PYG",
             "HD10":"PYG",
             "HD11":"00000 A000005",
             "HD12":"",
             "HD13":"",
             "HD14":"",
             "HD15":"",
             "HD16":"",
             "HD17":"Insufficient Funds",
             "HD18":"",
             "HD19":"",
             "HD20":"",
             "HD21":0,
             "HD22":"ICAE",
             "HD23":false,
             "HD24":false,
             "HD26":0
          },
          "SIEL":{
             "SIE":[
                {
                   "sequenceNumber":0,
                   "itemId":"1159",
                   "itemDescription":"BREAD FOR PANCHO",
                   "unitAmount":3500,
                   "quantity":0.001,
                   "subTotalAmount":4,
                   "discountAmount":0,
                   "totalAmount":4
                },
                {
                   "sequenceNumber":1,
                   "itemId":"2098",
                   "itemDescription":"HAPPY DAY CAKE",
                   "unitAmount":28950,
                   "quantity":0.001,
                   "subTotalAmount":29,
                   "discountAmount":0,
                   "totalAmount":29
                }
             ]
          }
       }
    },
    {
       "T":{
          "HD":{
             "HD01":"1",
             "HD02":"20201007",
             "HD03":"1001",
             "HD04":"15",
             "HD05":141,
             "HD06":"20201007063358",
             "HD07":"",
             "HD08":"3514401",
             "HD09":"PYG",
             "HD10":"PYG",
             "HD11":"0010580000125",
             "HD12":"",
             "HD13":"",
             "HD14":"",
             "HD15":"",
             "HD16":"",
             "HD17":"",
             "HD18":"",
             "HD19":"",
             "HD20":"",
             "HD21":16100,
             "HD22":"ICAE",
             "HD23":false,
             "HD24":false,
             "HD26":-47
          },
          "SIEL":{
             "SIE":[
                {
                   "sequenceNumber":0,
                   "itemId":"1110",
                   "itemDescription":"STICK WITHOUT ANISE",
                   "unitAmount":9100,
                   "quantity":1.115,
                   "subTotalAmount":10147,
                   "discountAmount":0,
                   "totalAmount":10147                   
                },
                {
                   "sequenceNumber":1,
                   "itemId":"7841503001513",
                   "itemDescription":"TRIPACK CRACKER CLASS",
                   "unitAmount":6000,
                   "quantity":1,
                   "subTotalAmount":6000,
                   "discountAmount":0,
                   "totalAmount":6000                 
                   }
                }
             ]
          }
       }
    }
 ]';

    $json = json_decode($data3, true);

     $tickets = collect($json)->map(function ($value) {
              return ????
    });

So, I don't know how to put it in the return so that the data is sent and go through it as a single combined table

Example of how it should be:

Table

CodePudding user response:

One possible solution would be to obtain all the keys from the JSON string and store those as a separate variable, then do something similar for the actual data.

So for example, to obtain all the keys from your JSON you could do the following:

$keys =
    collect(json_decode($data)[0]->T->HD)
    ->merge(collect(json_decode($data)[0]->T->SIEL->SIE[0]))
    ->keys();

What this does is produce an array of just the JSON keys you're interested in making iterating over the keys nice and simple.

@foreach ($keys as $key)
    {{ $key }}
@endforeach

As for your data, it would be a similar process but instead we're focusing on the values of the JSON rather than the keys.

$data = collect(json_decode($data))->map(function ($element) {
    return collect($element->T->HD)->merge(collect(['SIE' => $element->T->SIEL->SIE]));
});

This results in a (somewhat flattened) collection of your data with all HD prefixed keys at the top level of each collection element and a sub collection of SIE elements.

[
  "HD01" => 1,
  "HD02" => 2,
  ...
  "SIE" => [
    [
      "sequenceNumber":0,
      "itemId":"1110",
      "itemDescription":"STICK WITHOUT ANISE",
      ...
    ],
    ...
  ]
]

From here it should be a straight forward process of iterating over the data in your blade view to ouput it.

A functional example here.

  • Related