Get value of object array

I have the following json:

$data = '{"code":"08261",
          "currency":"EUR", 
          "packs":[ {"amount":0.05,"measure":"g","price":73.0}, 
                    {"amount":0.1,"measure":"g","price":108.0}, 
                    {"amount":0.25,"measure":"g","price":154.0}, 
                    {"amount":0.5,"measure":"g","price":296.0}, 
                    {"amount":1.0,"measure":"g","price":394.0}, 
                    {"amount":2.5,"measure":"g","price":771.0}, 
                    {"amount":5.0,"measure":"g","price":1142.0}, 
                    {"amount":10.0,"measure":"g","price":1693.0}]}'; 

I can get the value of code and currency as follows:

// Option 1: through the use of an array.
$jsonArray = json_decode($data,true);

$code =  $jsonArray['code'];

// Option 2: through the use of an object.
$jsonObj = json_decode($data);

$code = $jsonObj->code;

How can I get the price for the following packs where the:

  1. amount is ‘1.0’ and measure is ‘g’
  2. amount is ‘5.0’ and measure is ‘g’
  3. amount is ‘10.0’ and measure is ‘g’

>Solution :

If you convert the json into nested arrays (passing true to the $associative parameter of json_decode, you can then use array_filter to filter the packs to find the values you want:

$data = '{"code":"08261",
          "currency":"EUR", 
          "packs":[ {"amount":0.05,"measure":"g","price":73.0}, 
                    {"amount":0.1,"measure":"g","price":108.0}, 
                    {"amount":0.25,"measure":"g","price":154.0}, 
                    {"amount":0.5,"measure":"g","price":296.0}, 
                    {"amount":1.0,"measure":"g","price":394.0}, 
                    {"amount":2.5,"measure":"g","price":771.0}, 
                    {"amount":5.0,"measure":"g","price":1142.0}, 
                    {"amount":10.0,"measure":"g","price":1693.0}]}'; 

function get_price($data, $amount, $measure) {
    $values = array_filter($data['packs'], function ($a) use ($measure, $amount) {
        return $a['amount'] == $amount && $a['measure'] == $measure;
    });
    if (count($values)) return reset($values)['price'];
    return 0;
}

$data = json_decode($data, true);

echo get_price($data, 1.0, 'g') . PHP_EOL;
echo get_price($data, 5.0, 'g') . PHP_EOL;
echo get_price($data, 10.0, 'g') . PHP_EOL;

Output:

394
1142
1693

Leave a Reply