Hướng dẫn how to get nested object value in php - cách lấy giá trị đối tượng lồng nhau trong php

Này các bạn, tôi dường như không thể có được cú pháp ở đây đúng, tôi chỉ cố gắng xem loại có tồn tại không, tôi đã thử

if($obj->type)    /* do something */
if($obj[0]->type) /* do something */
if($obj->type[0]) /* do something */

Về điều này

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))

Nhưng dường như không thể hiểu đúng, tôi tin rằng nó có liên quan đến [0] là một int thay vì varchar nhưng tôi không biết ....

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

[{
	"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" }
}]
6 và sau đó sử dụng 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" }
}]
7 để 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

[{
	"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" }
}]
8 được đặt thành
[{
	"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" }
}]
9 để 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

$filepath = './persons.txt';
$json_string = file_get_contents($filepath);
$json = json_decode($json_string, true);
0 để 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

$filepath = './persons.txt';
$json_string = file_get_contents($filepath);
$json = json_decode($json_string, true);
0 để 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ó.

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
0

Output:

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
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.

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
2

Output:

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
3

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

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
4

Output:

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
5

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.

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
6

Output:

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
7

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.

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
8

Trong mã trên, hàm

$filepath = './persons.txt';
$json_string = file_get_contents($filepath);
$json = json_decode($json_string, true);
2 tự gọi chính nó nếu giá trị là một mảng khác in khóa và giá trị.

Output:

stdClass::__set_state(
array(
   '0' => 
  stdClass::__set_state(
  array(
     'report_number' => '555',
     'type' => 'citrus',
     'region' => 'Seattle',
     'customer_number' => '9757',
     'customer' => 'The Name',
     'location' => 'West Seattle, WA',
     'shipper' => 'Yamato Transport',
     'po' => '33215',
     'commodity' => 'RARE',
     'label' => 'PRODUCE',
  )),
))
9

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

$filepath = './persons.txt';
$json_string = file_get_contents($filepath);
$json = json_decode($json_string, true);
3 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

[{
	"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" }
}]
0

Output:

[{
	"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ươ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ể.

[{
	"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

Output:

[{
	"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" }
}]
3

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

[{
	"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" }
}]
4

Output:

[{
	"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" }
}]
5

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.