【问题标题】:How to write a recursive foreach display function in PHP for a large multidimensional JSON file如何在 PHP 中为大型多维 JSON 文件编写递归 foreach 显示函数
【发布时间】:2016-08-31 02:09:16
【问题描述】:

我是一个 PHP 新手,我已经知道如何编写一个 foreach 循环并为每个维度嵌套 IF 语句。

当出现大型多维 JSON 时,问题就开始了。编写无限的 IF 语句会适得其反,所以我试图找到一个递归解决方案来显示任何未来的 JSON 文件,无论它们有多深。

在我执行的每个 google/stack 搜索中,我发现的问题非常遥远,因为每个人都提出了与他们自己的代码相关的问题,而我只是想找到一个清晰而整洁的答案.

我希望如果这里有人愿意在编写这个函数时提供指导,我不知道从哪里开始:/

这是一个来自魔鬼本人的 JSON 文件:

  {
    "_id": "572b0a2c5924669b98a31791",
    "index": 0,
    "guid": "34989172-83cb-466a-87f6-76bbf374eff3",
    "isActive": true,
    "balance": "$2,859.31",
    "picture": "http://placehold.it/32x32",
    "age": 28,
    "eyeColor": "blue",
    "name": "Compton Wells",
    "gender": "male",
    "company": "NETPLAX",
    "email": "comptonwells@netplax.com",
    "phone": "+1 (932) 505-3240",
    "address": "452 George Street, Stollings, Iowa, 5009",
    "about": "Aliqua id nostrud adipisicing qui non pariatur enim nisi aliqua Lorem pariatur tempor ullamco fugiat. Pariatur velit cillum sunt in mollit dolor ex ullamco ut proident. Id Lorem sit cupidatat sunt deserunt. Exercitation magna excepteur incididunt proident minim mollit fugiat ad officia magna laboris enim labore veniam. Id cillum dolore ad non cupidatat aute labore enim esse et consequat amet. Exercitation excepteur anim cillum nisi est aliquip pariatur eu. Irure dolore laboris eiusmod qui Lorem consectetur enim nisi fugiat.\r\n",
    "registered": "2015-11-10T01:03:21 -02:00",
    "latitude": 42.546775,
    "longitude": -164.862723,
    "tags": [
      "occaecat",
      "veniam",
      "et",
      "eu",
      "nulla",
      "dolor",
      "labore"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Francisca Merrill"
      },
      {
        "id": 1,
        "name": "Jimmie Baxter"
      },
      {
        "id": 2,
        "name": "Essie Campbell"
      }
    ],
    "greeting": "Hello, Compton Wells! You have 4 unread messages.",
    "favoriteFruit": "strawberry"
  },
  {
    "_id": "572b0a2ca3c188d22631ce56",
    "index": 1,
    "guid": "61631ddc-6ffc-488d-a33b-96d6543256d1",
    "isActive": true,
    "balance": "$3,328.73",
    "picture": "http://placehold.it/32x32",
    "age": 32,
    "eyeColor": "blue",
    "name": "Campbell Steele",
    "gender": "male",
    "company": "HELIXO",
    "email": "campbellsteele@helixo.com",
    "phone": "+1 (944) 532-3258",
    "address": "662 Taylor Street, Fairhaven, Marshall Islands, 7101",
    "about": "Ex reprehenderit veniam id aliqua fugiat id. Non qui qui velit consectetur ipsum et cillum excepteur culpa proident amet. Quis cillum eiusmod ad minim anim amet occaecat excepteur.\r\n",
    "registered": "2014-05-01T11:43:54 -03:00",
    "latitude": -70.879773,
    "longitude": -91.252999,
    "tags": [
      "eu",
      "aliqua",
      "dolor",
      "sint",
      "tempor",
      "Lorem",
      "exercitation"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Maryellen Castro"
      },
      {
        "id": 1,
        "name": "Beatrice Thomas"
      },
      {
        "id": 2,
        "name": "Megan Fleming"
      }
    ],
    "greeting": "Hello, Campbell Steele! You have 5 unread messages.",
    "favoriteFruit": "apple"
  },
  {
    "_id": "572b0a2ce75622f7763c0a4a",
    "index": 2,
    "guid": "96afcfc5-447e-4b86-9cf3-a31da0cb67a0",
    "isActive": false,
    "balance": "$2,871.94",
    "picture": "http://placehold.it/32x32",
    "age": 24,
    "eyeColor": "brown",
    "name": "Loretta Roth",
    "gender": "female",
    "company": "FROLIX",
    "email": "lorettaroth@frolix.com",
    "phone": "+1 (903) 507-2688",
    "address": "244 Freeman Street, Bluetown, Colorado, 7778",
    "about": "Enim in et sunt ea sint proident. Consequat ad proident adipisicing voluptate. Veniam est consequat ut aliqua adipisicing culpa nulla ex aliquip Lorem enim eiusmod voluptate sint. Magna enim nulla cillum irure qui occaecat aliqua tempor sint pariatur aliquip officia nostrud. Non aliqua aliqua minim magna do aliqua. Mollit consectetur exercitation aliqua tempor cupidatat.\r\n",
    "registered": "2014-05-10T09:54:48 -03:00",
    "latitude": 5.431549,
    "longitude": 116.259865,
    "tags": [
      "non",
      "anim",
      "in",
      "elit",
      "consequat",
      "do",
      "dolor"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Heidi Holman"
      },
      {
        "id": 1,
        "name": "Cindy Fernandez"
      },
      {
        "id": 2,
        "name": "Maura Edwards"
      }
    ],
    "greeting": "Hello, Loretta Roth! You have 5 unread messages.",
    "favoriteFruit": "banana"
  },
  {
    "_id": "572b0a2cdaf81b24bbef848b",
    "index": 3,
    "guid": "02d79968-7eef-4600-9553-fa035ef196f1",
    "isActive": false,
    "balance": "$2,691.37",
    "picture": "http://placehold.it/32x32",
    "age": 24,
    "eyeColor": "blue",
    "name": "Beasley Strong",
    "gender": "male",
    "company": "VURBO",
    "email": "beasleystrong@vurbo.com",
    "phone": "+1 (902) 482-3914",
    "address": "151 Apollo Street, Matheny, Utah, 1267",
    "about": "Ea nisi exercitation aliqua dolor laboris non reprehenderit nulla occaecat qui fugiat. Ipsum cillum eiusmod tempor elit voluptate quis esse. Pariatur aute cillum commodo et est anim nisi sit nostrud do ea sit. In adipisicing officia et velit sunt anim irure culpa sint enim velit cillum. Id est id labore sunt mollit duis veniam duis duis pariatur nulla amet culpa velit. Deserunt reprehenderit in dolor ut pariatur non commodo sit cillum eiusmod aliquip quis. Consequat non velit cupidatat magna pariatur.\r\n",
    "registered": "2016-02-10T09:24:38 -02:00",
    "latitude": 61.905235,
    "longitude": 9.908656,
    "tags": [
      "nostrud",
      "laborum",
      "non",
      "non",
      "tempor",
      "nostrud",
      "nisi"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Morris Lucas"
      },
      {
        "id": 1,
        "name": "Jeannette Michael"
      },
      {
        "id": 2,
        "name": "Black Duke"
      }
    ],
    "greeting": "Hello, Beasley Strong! You have 9 unread messages.",
    "favoriteFruit": "apple"
  },
  {
    "_id": "572b0a2c13804da61c1927b9",
    "index": 4,
    "guid": "6f15b064-d21a-4979-a380-e96a8d931258",
    "isActive": true,
    "balance": "$3,235.01",
    "picture": "http://placehold.it/32x32",
    "age": 38,
    "eyeColor": "brown",
    "name": "Byrd Nieves",
    "gender": "male",
    "company": "FIBEROX",
    "email": "byrdnieves@fiberox.com",
    "phone": "+1 (901) 496-3284",
    "address": "528 Hart Street, Hatteras, Nevada, 4179",
    "about": "Consectetur sint consequat cupidatat ullamco qui consectetur nostrud ex cillum aliqua velit. Irure Lorem tempor nostrud labore est enim aute ex irure fugiat exercitation. Non eiusmod pariatur excepteur elit velit reprehenderit irure quis ea adipisicing sunt. Sunt consectetur cupidatat ad eiusmod pariatur Lorem aliqua exercitation laborum.\r\n",
    "registered": "2014-03-13T06:40:39 -02:00",
    "latitude": -88.232991,
    "longitude": 15.675919,
    "tags": [
      "consectetur",
      "aliqua",
      "nisi",
      "mollit",
      "magna",
      "consequat",
      "ut"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Strickland Bender"
      },
      {
        "id": 1,
        "name": "Manuela Holt"
      },
      {
        "id": 2,
        "name": "Esther Sutton"
      }
    ],
    "greeting": "Hello, Byrd Nieves! You have 5 unread messages.",
    "favoriteFruit": "strawberry"
  }

【问题讨论】:

  • 那不是有效的 json,你可以在这里验证你的 json,jsonlint.com
  • 感谢 Rajdeep 的通知,您可以看到它是来自生成器的渲染 JSON (json-generator.com) 但问题仍然存在。
  • @ErezMatrix 所以你想使用foreach循环递归地打印所有数据,对吧?
  • 是的,不管有多少维度。

标签: php json recursion multidimensional-array foreach


【解决方案1】:

解决办法是:

  • 首先使用json_decode()函数解码你的json数据,这会给你一个多维数组。
  • 现在使用foreach 循环递归迭代数组并打印所有(键、值)对。

所以你的代码应该是这样的:

function process_jsonData($array){
    foreach($array as $key => $value){
        if(is_array($value)){
            process_jsonData($value);
        }else{
            echo $key . ": " . $value . "<br />";
        }
    }
}

// Suppose $json is your json data 
$jsonData = json_decode($json, true);
process_jsonData($jsonData);

【讨论】:

  • 我唯一的代码是:$json = file_get_contents("large.json"); $jsonD = json_decode($json, true);除此之外,它是您的代码,它不显示任何内容。
  • @ErezMatrix,然后像这样简单地调用函数,process_jsonData($jsonD);。出于调试目的,您可以通过var_dump(jsonD); 查看实际的多维数组。
  • 是的 var_dump($jsonD);效果很好。有什么功能?
  • @Erez.Matrix 该功能在我这边正常工作。你没有得到任何输出吗?
  • 奇怪,vardump 显示了我所说的所有内容,但删除后它只显示一个空白页面,控制台中也没有任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多