Hướng dẫn php nested json - php lồng nhau json

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

foreach($json_array as $elem)  {
   echo($elem['id']. ", ".$elem['name'] );
   echo("
"); }
4 và sau đó sử dụng hàm
foreach($json_array as $elem)  {
   echo($elem['id']. ", ".$elem['name'] );
   echo("
"); }
5 để 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

foreach($json_array as $elem)  {
   echo($elem['id']. ", ".$elem['name'] );
   echo("
"); }
6 được đặt thành
foreach($json_array as $elem)  {
   echo($elem['id']. ", ".$elem['name'] );
   echo("
"); }
7 để 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

foreach($json_array as $elem)  {
   echo($elem['id']. ", ".$elem['name'] );
   echo("
"); }
8 để 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

foreach($json_array as $elem)  {
   echo($elem['id']. ", ".$elem['name'] );
   echo("
"); }
8 để 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.

foreach($json as $elem)  {
   echo( $elem['name']. " : " );
   foreach ($elem['cars'] as $car ) {
      echo($car['make']. ", ");
   }
   echo("
"); }

Đầu ra

Max Adams : Mercedes, Audi,
Steven Miller : Tesla,
Daniel James : Bugatti,

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

foreach($json as $elem)  {
   echo( $elem['name'].": ".count($elem['cars']));
   echo("
"); }

Output:

Max Adams: 2
Steven Miller: 1
Daniel James: 1

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.

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

Output:

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

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

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

Output:

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

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.

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

Output:

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

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.

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

Trong mã trên, hàm

2, Steven Miller
3, Daniel James
0 tự gọi chính nó nếu giá trị là một mảng khác in khóa và giá trị.

Output:

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

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

2, Steven Miller
3, Daniel James
1 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

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

Output:

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

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ể.

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

Output:

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

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 đó.

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

Output:

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

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.