在php中循环解析json字符串

时间:2011-05-12 13:16:16

标签: php arrays json

我有一个由JSON格式的URL返回的复杂结构,我得到了我可以通过var_dump查看的响应,现在我有这个响应,

{
  "groups": [],
  "total_pages": 1,
  "spots": [
    {
      "address": {
        "region": "TX",
        "locality": "Austin"
      },
      "name": "Dirty Bill's",
      "checkins_count": 646,
      "_image_url_200": "http://static.gowalla.com/categories/28-b0d41920d32839ce1ecd6641e5fc2c87-200.png",
      "image_url": "http://static.gowalla.com/categories/28-78c9b4d7d239784df49dc932f64a3519-100.png",
      "_image_url_50": "http://static.gowalla.com/categories/28-78c9b4d7d239784df49dc932f64a3519-100.png",
      "radius_meters": 50,
      "trending_level": 0,
      "users_count": 375,
      "url": "/spots/43711",
      "checkins_url": "/checkins?spot_id=43711",
      "lng": "-97.7495040214",
      "spot_categories": [
        {
          "name": "Dive Bar",
          "url": "/categories/28"
        }
      ],
      "foursquare_id": null,
      "highlights_url": "/spots/43711/highlights",
      "items_url": "/spots/43711/items",
      "items_count": 11,
      "strict_radius": false,
      "description": "AKA the Gnome Bar. Much Warmer than Key Bar.",
      "activity_url": "/spots/43711/events",
      "lat": "30.2696322356",
      "photos_count": 23
    },
    {
      "address": {
        "region": "TX",
        "locality": "Austin"
      },
      "name": "Austin Wellness Clinic",
      "checkins_count": 1,
      "_image_url_200": "http://static.gowalla.com/categories/118-b41c2ba96f1ffe99fc23f12f0ee3b960-200.png",
      "image_url": "http://static.gowalla.com/categories/118-5f9e72162abf3dcbc0108cdbdba6a29f-100.png",
      "_image_url_50": "http://static.gowalla.com/categories/118-5f9e72162abf3dcbc0108cdbdba6a29f-100.png",
      "radius_meters": 75,
      "trending_level": 0,
      "users_count": 1,
      "url": "/spots/7360448",
      "checkins_url": "/checkins?spot_id=7360448",
      "lng": "-97.7495133877",
      "spot_categories": [
        {
          "name": "Health & Fitness",
          "url": "/categories/118"
        }
      ],
      "foursquare_id": null,
      "highlights_url": "/spots/7360448/highlights",
      "items_url": "/spots/7360448/items",
      "items_count": 0,
      "strict_radius": false,
      "description": null,
      "activity_url": "/spots/7360448/events",
      "lat": "30.2695755256",
      "photos_count": 0
    },

我使用了json_decode($ response,true)来获取一个解析变量,现在我不知道如何循环它。有什么想法吗?!

编辑1:斑点是一个数组[],其索引为0.我想循环遍历斑点数组中的每个名称值对

4 个答案:

答案 0 :(得分:3)

<?php

$json = json_encode(
    array(
        'spots' => array(
            'bar' => 'baz',
            array(
                'quz' => 'foo',
                'bar' => 'baz'
            )
        )
    )
);

$root = json_decode( $json, true );

function read( $array ) {
    foreach( (array) $array as $key => $value ) {
        if( is_array( $value ) ) {
            read( $array );
        }
        echo "$key = $value\n";
    }
}

foreach( $root['spots'] as $spot ) {
    read( $spot );
}

这应该为您提供spot数组内的所有信息。

编辑:现在使用实际检查的语法,它可以正常工作。

答案 1 :(得分:2)

$result = json_decode($response,true);

foreach($result['spots'] as $spot)
{
    echo $spot['address']['locality'];
}

答案 2 :(得分:2)

或试试这个:

$result = json_decode($response,true);
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($result));
foreach($iterator as $key=>$value) {
        echo "<b>".$key."</b><br />".$value."<br />";
}

这将转换一个简单数组中的复杂关联数组以进行循环。
希望这会有所帮助。

答案 3 :(得分:0)

你不会循环使用它,你可以使用recursion来完成它。您需要编写一个可以调用自身的函数,将该结构的不同分支作为参数传递给自身。 This可能会帮助您进行PHP递归。