从PHP解析Javascript的Javascript

从PHP解析Javascript的Javascript

问题描述:

I am passing a json encoded string in an ajax response to my Javascript. When I console.log the json, after JSON.Parse, it looks like the following:

[
 {"732":
    {
      "doctor_name":"First M. Last ",
      "degree":"MD"
    }
 },
 {"377":
    {
      "doctor_name":"First M. Last ",
      "degree":"MD"
    }
 },
 {"1092":
    {
      "doctor_name":"First M. Last",
      "degree":"DO"
    }
 },
 {"759":
    {
      "doctor_name":"First M. Last",
      "degree":"MD"
    }
  },
  {"1628":
    {
      "doctor_name":"First M. Last",
      "degree":"DO"
    }
   }
] 

I need to access each one of these objects without knowing the ids (in this case "732", "377", "1092", "759", etc.)

Not sure if my data is even structured properly but I cannot even use Object.keys(obj) as it returns an error of a non-object property.

The way I am structuring my PHP array is as follows:

 foreach ($doctors as $group){
    $doctor_results[][(int)$group->prac_id]=array(
      'doctor_name' => (string)$group->name,
      'degree' => (string)$group->degree,
    );
  } // end foreach

I want each array id to be used as the key, not sure if this makes much sense. TYIA

You most likely want your PHP to look like:

 foreach ($doctors as $group){
    $doctor_results[(int)$group->prac_id]=array(
      'doctor_name' => (string)$group->name,
      'degree' => (string)$group->degree,
    );
  } // end foreach

Note the missing [], which would imply pushing an item onto a numeric array. The second set of brackets in your example is suggesting to PHP that the numeric element created should be an associative array with an item with the 'prac_id' as a key. PHP is automatically creating that associative array, creating the structure with your key nested one level further in than you want for being able to grab an item by 'prac_id' by simple key access in JavaScript. As is, you'd need a nested loop like in Darren's answer.

I heavily agree with the comments posted by Marty and Six Fingered Man, but if you wanted to loop through the json, this would work:

jQuery.each(obj, function(index, data){
    jQuery.each(data, function(id, fields){
        console.log(id); // returns the ID's of the objects: 732, 377,....etc
        console.log(fields); // returns the fields for each object. (doctor_name & degree)
    });
});

JSFiddle Demo

    [
 {prac_id:"732",data:
    {
      "doctor_name":"First M. Last ",
      "degree":"MD"
    }
 },...]

foreach ($doctors as $group){
$doctor_results[][(int)$group->{'prac_id'}]=array(
  'doctor_name' => (string)$group->{'data'}->{'name'},
  'degree' => (string)$group->{'data'}->{'degree'},
);

} // end foreach

Your ajax response is array of OBJECT. If you encode it by json_encode($array), your ajax response is OK. You can check your ajax response here : http://json.parser.online.fr/

So I think you can modify your ajax call. You can just add this dataType: 'json' in your ajax. It will automatically handle your JSON response.

$.ajax({                                            
  url: 'your_ajax_url',                        
  data: 'data',                                                         
  dataType: 'json',                  
  success: function(data)          
  {   
    $.each(data, function(index, obj){
      $.each(obj, function(id, nested_obj){
        console.log("ID: "+id);
        console.log("doctor name: "+nested_obj['doctor_name']+",degree:"+ nested_obj['degree']  );
      });
    });
  }
)}