turn cURL json array response to an associate array

31,717

Solution 1

By default curl_exec outputs the data it gets from the server to the standard output so your $response variable doesn't really have the actual response data in it. If you want to get the data in a variable set the CURLOPT_RETURNTRANSFER option before calling curl_exec.

curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE)

Solution 2

json_decode gives you an associative array when you pass "true" as the second argument:

  $json = '[{"Id":1079,"Name":"Test ","Status":1,"MemberId":1308,"Description":"This is a Test Event","SponsoredBy":null,"StartTime":"2013-06-30T12:00:00","EndTime":"2013-06-30T23:59:00","SearchDescription":null,"Types":[1,4,6]}]';

  $response = json_decode($json, true);

  echo $response[0]["Name"];

gives:

Test

Edit:

json_decode() is giving you back an array of arrays, so you need to reference the array that is at position [0] in the response, if you get me.

I've done that above in my example with $response[0], but have a look at this example, hope it makes it clearer!

  $result = json_decode($json, true);
  var_dump($result);

gives:

array(1) {
  [0]=>
  array(10) {
    ["Id"]=>
    int(1079)
    ["Name"]=>
    string(5) "Test "
    ["Status"]=>
    int(1)
    ["MemberId"]=>
    int(1308)
    ["Description"]=>
    string(20) "This is a Test Event"
    ["SponsoredBy"]=>
    NULL
    ["StartTime"]=>
    string(19) "2013-06-30T12:00:00"
    ["EndTime"]=>
    string(19) "2013-06-30T23:59:00"
    ["SearchDescription"]=>
    NULL
    ["Types"]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(4)
      [2]=>
      int(6)
    }
  }
}

then.. to access the array itself:

  $result = json_decode($json, true);

  $result = $result[0]; // let's just reassign this to get the array we want      
  var_dump($result);

gives:

array(10) {
  ["Id"]=>
  int(1079)
  ["Name"]=>
  string(5) "Test "
  ["Status"]=>
  int(1)
  ["MemberId"]=>
  int(1308)
  ["Description"]=>
  string(20) "This is a Test Event"
  ["SponsoredBy"]=>
  NULL
  ["StartTime"]=>
  string(19) "2013-06-30T12:00:00"
  ["EndTime"]=>
  string(19) "2013-06-30T23:59:00"
  ["SearchDescription"]=>
  NULL
  ["Types"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(4)
    [2]=>
    int(6)
  }
}

And now you can access the various elements of the array directly:

  $result = json_decode($json, true);
  $result = $result[0];

  echo "Name: ". $result["Name"] . "\nID:   " . $result["Id"] . "\nDescription: " . $result["Description"] . "\n";

now we get back:

Name: Test 
ID:   1079
Description: This is a Test Event

hope that makes sense!

Share:
31,717
vinylDeveloper
Author by

vinylDeveloper

Updated on January 30, 2022

Comments

  • vinylDeveloper
    vinylDeveloper over 2 years

    I have a cURL request like so

    $ch = curl_init();
    $data = 'filter=year(StartTime)' . urlencode(' eq 2013 and ') .'month(StartTime)'. urlencode(' eq 06') ;
    curl_setopt($ch, CURLOPT_URL, "http://url.com/id()/events?$".$data);
    $headers = array(
        'Accept: application/json',
        'Content-type: application/json',
        'X-ApiKey : XXXXXXXXXX'
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HEADER, false);
    
    $response = curl_exec($ch);
    curl_close($ch);
    $result = json_decode($response, true);
    
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Untitled Document</title>
    
    
    </head>
    
    <body>
    
    <br><br>
    <?php 
     echo "the name". $result['Name'];
    ?>
    
    </body>
    </html>
    

    This is what it prints.

    HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 218 Content-Type: application/json; charset=utf-8 Expires: -1 Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET- WEBSRV X-Powered-By: ARR/2.5 X-Powered-By: ASP.NET - ARR02 Date: Mon, 01 Jul 2013 02:52:31 GMT [{"Id":1079,"Name":"Test ","Status":1,"MemberId":1308,"Description":"This is a Test Event","SponsoredBy":null,"StartTime":"2013-06-30T12:00:00","EndTime":"2013-06-30T23:59:00","SearchDescription":null,"Types":[1,4,6]}] 
    
    the name
    

    How can I put this into a Associative array?

    I've tried this

    json_decode($response,true));
    

    and this

    ksort($response);
    

    and this

    var_dump($response);
    

    and nothing seems to work..

    I want to be able to output like this

    echo $reponse['Name'];
    

    Any help? Thanks