Hướng dẫn php parse nested json - php phân tích cú pháp json lồng nhau

Tôi có điều này phức tạp

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
8 mà tôi muốn phân tích nó trong
{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
9 để tôi có thể xây dựng
$arrData    =  json_decode($json);
  echo '';
0.

Tôi muốn xây dựng thả xuống dưới dạng


Ngay bây giờ tôi đang làm một cái gì đó như thế này không hoạt động

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';

Sở thích của tôi là

$arrData    =  json_decode($json);
  echo '';
1 từ trên
{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
8

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }

Nhưng tôi không muốn

$arrData    =  json_decode($json);
  echo '';
3 điều này một cách riêng biệt. Thay vào đó tôi muốn phân tích toàn bộ
{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
8

$arrData    =  json_decode($json);
  echo '';

Một tài liệu JSON có thể có các đối tượng JSON được lồng bên trong các đối tượng JSON khác. Đối tượng JSON là các cặp giá trị khóa và có nhiều phương pháp khác nhau bạn có thể sử dụng để truy cập các đối tượng JSON từ tài liệu JSON lồng nhau. Một phương pháp là sử dụng đệ quy giống như bạn truy cập dữ liệu từ một mảng lồng hoặc cấu trúc dữ liệu cây. Một phương pháp khác là sử dụng các vòng lặp. Chúng ta hãy xem một số ví dụ để truy cập dữ liệu một tài liệu JSON lồng nhau như bên dưới.

[{
	"id": 1,
	"name": "Max Adams",
	"born": "21 Oct 2001",
	"cars": [
		{"make": "Mercedes", "model": "GLS"	},
		{"make": "Audi", "model": "Q8" }
		],
	"favourite": { "colour": "Blue", "movie": "Toy Story" }
},
{
	"id": 2,
	"name": "Steven Miller",
	"born": "28 Jul 2004",
	"cars": [
		{"make": "Tesla", "model": "Model S"}
        ],
	"favourite": { "colour": "Red", "movie": "Mulan" }
},
{
	"id": 3,
	"name": "Daniel James",
	"born": "18 Dec 2005",
	"cars": [
		{"make": "Bugatti", "model": "Chiron"}
		],
	"favourite": { "colour": "Yellow", "movie": "Frozen", "toy": "Teddy" }
}]

Đọc JSON

Hãy xem xét rằng ví dụ JSON của chúng tôi được lưu trữ trong một tệp có tên "person.txt". Đầu tiên đọc nội dung của tệp văn bản thành một biến chuỗi bằng hàm

$arrData    =  json_decode($json);
  echo '';
5 và sau đó sử dụng hàm
$arrData    =  json_decode($json);
  echo '';
6 để chuyển đổi chuỗi JSON thành biến PHP.

$filepath = './persons.txt';
$json_string = file_get_contents($filepath);
$json = json_decode($json_string, true);

Lưu ý rằng đối số thứ hai trong hàm

$arrData    =  json_decode($json);
  echo '';
7 được đặt thành
$arrData    =  json_decode($json);
  echo '';
8 để các đối tượng được trả về sẽ là mảng liên kết.

Để biết thêm chi tiết về phân tích cú pháp JSON trong PHP, hãy đọc cách phân tích cú pháp JSON trong PHP

Truy cập các đối tượng bên trong mảng JSON

Để truy cập các đối tượng bên trong mảng JSON, phương pháp đơn giản nhất và dễ nhất là sử dụng vòng lặp

$arrData    =  json_decode($json);
  echo '';
9 để lặp lại thông qua các phần tử mảng và lấy dữ liệu mà bạn cần. Ví dụ: để in tất cả tên và số ID từ tài liệu JSON ví dụ của chúng tôi:

foreach($json_array as $elem)  {
   echo($elem['id']. ", ".$elem['name'] );
   echo("
"); }

Điều này sẽ đầu ra

2, Steven Miller
3, Daniel James

Truy cập các đối tượng lồng bên trong mảng JSON

Giá trị của JSON có thể là một đối tượng JSON khác. Trong ví dụ của chúng tôi, JSON, có ba đối tượng JSON tương ứng với các chi tiết về một người. Đối với mỗi người, có một chìa khóa được đặt tên là yêu thích có giá trị là một đối tượng JSON khác. Bạn có thể truy cập đối tượng JSON bên trong này giống như bạn truy cập một mảng kết hợp đa chiều.

Để in tất cả các tên và màu yêu thích tương ứng.

foreach($json as $elem)  {
   echo( $elem['name']." - ".$elem['favourite']['colour'] );
   echo("
"); }

Output:

Max Adams - Blue
Steven Miller - Red
Daniel James - Yellow

Truy cập các mảng JSON bên trong JSON lồng nhau

Nếu bạn có một mảng bên trong một đối tượng JSON lồng nhau thì hãy sử dụng hai vòng

$arrData    =  json_decode($json);
  echo '';
9 để truy cập vào phần tử mảng bên trong.

Để in tất cả các tên và xe tương ứng.

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
0

Đầu ra

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
1

Dưới đây là một ví dụ khác để in số lượng xe mà mỗi người có.

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
2

Output:

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
3

Tìm kiếm một JSON lồng nhau theo giá trị

Cho đến nay, chúng ta đã thấy cách truy cập tất cả các đối tượng ở một cấp độ cụ thể. Bây giờ chúng ta học cách tìm kiếm một JSON lồng nhau cho một giá trị cụ thể.

Ví dụ đầu tiên của chúng tôi là tìm tất cả những người sở hữu 'Tesla' từ JSON mẫu của chúng tôi.

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
4

Output:

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
5

Trong ví dụ tiếp theo, chúng tôi tìm kiếm những người thích màu 'xanh'

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
6

Output:

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
7

Tìm kiếm một JSON lồng nhau bằng khóa

Trong ví dụ tiếp theo này, chúng tôi tìm kiếm một khóa thay vì một giá trị. Ví dụ để tìm những người có một món đồ chơi yêu thích.

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
8

Output:

$json = '[
   {
      "class":"autocomplete",
      "name":"autocomplete-1481957691348-preview",
      "value":"there is nothing like me",
      "id":"autocomplete-1481957691348-preview",
      "type":"autocomplete",
      "tag":"INPUT"
   },
   {
      "class":"form-control",
      "name":"file-1481957721195-preview",
      "value":"",
      "id":"file-1481957721195-preview",
      "type":"file",
      "tag":"INPUT"
   },
   {
      "select-box":[
         {
            "selectName":"apple",
            "optionValue":"apple"
         },
         {
            "selectName":"banana",
            "optionValue":"banana"
         },
         {
            "selectName":"kiwi",
            "optionValue":"kiwi"
         }
      ]
   },
   {
      "class":"form-control",
      "name":"select-1481957826542-preview",
      "value":"jadu",
      "id":"select-1481957826542-preview",
      "type":"select",
      "tag":"SELECT"
   }
]';
9

KIỂM TRA TÌM HIỂU TẤT CẢ các khóa và giá trị

Bây giờ chúng tôi xem xét một phương pháp khác để truy cập dữ liệu từ một JSON - đệ quy lồng nhau. Trong phương pháp này, chúng tôi tạo một hàm tự gọi cho đến khi một điều kiện nhất định được đáp ứng.

Hãy bắt đầu với một đoạn mã đơn giản để in tất cả các khóa và giá trị trong tài liệu JSON mẫu của chúng tôi.

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
0

Trong mã trên, hàm

[{
	"id": 1,
	"name": "Max Adams",
	"born": "21 Oct 2001",
	"cars": [
		{"make": "Mercedes", "model": "GLS"	},
		{"make": "Audi", "model": "Q8" }
		],
	"favourite": { "colour": "Blue", "movie": "Toy Story" }
},
{
	"id": 2,
	"name": "Steven Miller",
	"born": "28 Jul 2004",
	"cars": [
		{"make": "Tesla", "model": "Model S"}
        ],
	"favourite": { "colour": "Red", "movie": "Mulan" }
},
{
	"id": 3,
	"name": "Daniel James",
	"born": "18 Dec 2005",
	"cars": [
		{"make": "Bugatti", "model": "Chiron"}
		],
	"favourite": { "colour": "Yellow", "movie": "Frozen", "toy": "Teddy" }
}]
1 tự gọi chính nó nếu giá trị là một mảng khác in khóa và giá trị.

Output:

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
1

Tìm kiếm theo khóa hoặc giá trị đệ quy

Bạn có thể tìm kiếm đệ quy theo khóa hoặc giá trị bên trong JSON lồng nhau với một sửa đổi nhỏ cho mã ở trên. Tất cả những gì bạn cần là Defina một hàm có hai đối số - một mảng và khóa/giá trị. Sau đó, bạn chạy cùng một đệ quy như trước nhưng bạn có một điều kiện

[{
	"id": 1,
	"name": "Max Adams",
	"born": "21 Oct 2001",
	"cars": [
		{"make": "Mercedes", "model": "GLS"	},
		{"make": "Audi", "model": "Q8" }
		],
	"favourite": { "colour": "Blue", "movie": "Toy Story" }
},
{
	"id": 2,
	"name": "Steven Miller",
	"born": "28 Jul 2004",
	"cars": [
		{"make": "Tesla", "model": "Model S"}
        ],
	"favourite": { "colour": "Red", "movie": "Mulan" }
},
{
	"id": 3,
	"name": "Daniel James",
	"born": "18 Dec 2005",
	"cars": [
		{"make": "Bugatti", "model": "Chiron"}
		],
	"favourite": { "colour": "Yellow", "movie": "Frozen", "toy": "Teddy" }
}]
2 khác để kiểm tra khóa/giá trị được chỉ định.

Đây là một ví dụ để có được tất cả các mô hình xe hơi

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
2

Output:

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
3

Tương tự, bạn có thể tìm kiếm một giá trị. Ví dụ, để tìm tất cả mọi người sinh ra vào một ngày cụ thể.

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
4

Output:

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
5

Tìm kiếm theo khóa và giá trị đệ quy

Trong các ví dụ trước, bạn đã tìm kiếm một khóa hoặc giá trị và lặp lại cặp giá trị khóa đó khi tìm thấy. Nhưng, hầu hết thời gian bạn có thể muốn tìm kiếm một khóa hoặc giá trị và lặp lại nút cha mẹ của nó hoặc một cặp giá trị khóa khác. Ví dụ: bạn muốn tìm kiếm một ngày và lặp lại tên của người sinh ra vào ngày đó. Hoặc, tìm kiếm một chiếc xe hơi và có được những người có chiếc xe đó. Đây là chức năng để làm điều đó.

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
6

Output:

{
          "select-box":[
             {
                "selectName":"apple",
                "optionValue":"apple"
             },
             {
                "selectName":"banana",
                "optionValue":"banana"
             },
             {
                "selectName":"kiwi",
                "optionValue":"kiwi"
             }
          ]
       }
7

PHP cũng cung cấp một số hàm mảng tích hợp để lấy dữ liệu từ JSON lồng nhau, một khi chuỗi JSON được giải mã thành đối tượng PHP. Chúng tôi sẽ thảo luận về điều này trong bài tiếp theo.