2013-03-30 32 views
0

我一直在试图解析一个没有成功的json数组。我可以得到一个根元素,但没有任何数组元素。下面是我的Foursquare的json数组的开始,它有重新发生的场地元素。解析PHP中的json数组

 response: { 
      keywords: {} 
      suggestedRadius: 10000 
      headerLocation: "here" 
      headerFullLocation: "here" 
      headerLocationGranularity: "unknown" 
      headerMessage: "Suggestions for Friday evening" 
      totalResults: 214 
      groups: [ 
       { 
        type: "Recommended Places" 
        name: "recommended" 
        items: [ 
         { 
         reasons: { 
         count: 0 
         items: [ ] 
         } 
         venue: { 
          id: "4b799a05f964a520b1042fe3" 
          name: "Green Gables" 
          contact: { 
          phone: "3097472496" 
          formattedPhone: "(309) 747-2496" 
            } 
          location: { 
          address: "17485 East 2500 North Rd" 

以下是我尝试获取餐厅名称的PHP代码。

$obj = json_decode($uri, true); 

    foreach($obj['response']['groups'] as $p) 
    { 
    if(isset($p['items'])) 
    { 
    foreach($p['items'] as $p1) 
{ 
    if(isset($p1['venue'])) 
    { 
// echo varDumpToString($p1['venue']); // this dump works ok and shows the elements 
foreach($p1['venue'] as $p2) 
{ 

    echo varDumpToString($p2['name']); // This is where I get the error 
    } 
    } 
    } 
    } 
    } 

程序向下钻取到name元素,然后给了我一个错误说“Unefined指数:名称”,并“非法串偏移名”此消息出现14次这是一次对每个项目该数组。那么,为什么是“名”不承认?

+0

当您使用json_decode()解码的JSON,你回吧作为一个数组或对象? 如果是对象,请尝试使用$ p2-> name。 – Adrian

+0

你确定节点转换为'array',而不是'stdObject'吗?在这种情况下,您可以通过'$ p2-> name'访问名称 – thaJeztah

+0

LOL @AdrianCrepaz击败了我 – thaJeztah

回答

2

response.groups[x].items[y].venue不是数组,你正在试图访问response.groups[x].items[y].venue[z].name,但实际上您访问response.groups[x].items[y].venue.id.name,它不存在。这最后foreach迭代会场属性而不是场地,每个项目只有一个场地

这是它应该是什么样子:

$obj = json_decode($uri, true); 

foreach ($obj['response']['groups'] as $group) { 
    if (isset($group['items'])) { 
     foreach ($group['items'] as $item) { 
      if (isset($item['venue'])) { 
       echo varDumpToString($item['venue']['name']); 
      } 
     } 
    } 
} 
+1

看起来像正确的答案 – thaJeztah

+0

那么,我最后一个foreach应该是什么样子?我尝试了所有我能想到的组合。为什么我要访问venue.id.name。我认为id和name是不同的元素。我只想将id和名称作为单独的项目。 – Dave

+0

@Dave - 看看我的例子。每个项目只有一个场地,所以你不能迭代它们。您还应该尝试使用更多描述性名称来提高可读性。这使得捕捉这样的错误变得更容易。 – jwueller

0

尝试改变这一行,

foreach($p1['venue'] as $p2) 

foreach($p1['venue'] as $p2Key => $p2) 
+0

这不会帮助'$ p2'在第一种情况下将包含'4b799a05f964a520b1042fe3',所以访问该字符串的'name'属性没有多大意义,这正是OPs代码不起作用的原因。 – jwueller