استخراج داده‌ها از JSON تودرتو با استفاده از روش خودفراخوانی و حلقه‌ها در PHP

یک سند JSON می‌تواند به اشیایی که به صورت تودرتو در داخل سایر اشیاء JSON قرار دارد، دسترسی داشته باشد. اشیای JSON زوج‌های کلید-مقدار هستند و روش‌های مختلفی وجود دارد که با استفاده از آنها می‌توانید به آبجکت‌های JSON از یک سند JSON تودرتو استفاده کنید. یک روش، استفاده از بازگشتی (فراخوانی یک برنامه توسط خودش)، درست مانند دسترسی به داده‎ها از یک ساختار داده آرایه‌ای یا درخت تودرتو است. روش دیگر استفاده از حلقه‌ها است.(آموزش رایگان لاراول) بیایید به مثال‌هایی برای دسترسی به داده‌های موجود در یک سند JSON که در زیر قرار دارد نگاه کنیم.

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

خواندن JSON

در نظر بگیرید که JSON مثال ما در فایلی با نام "persona.txt" ذخیره می‌شود. ابتدا محتویات فایل متنی را با استفاده از تابع ()file_get_contents گرفته و در یک متغیر ذخیره می‌کند و سپس از تابع ()json_decode استرینگ JSON را به متغیر PHP تبدیل می‌کند.

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

توجه داشته باشید که آرگومان دوم در تابع json_decode برابر با true قرار داده شده است، بنابراین آبجکت‌هایی که ریترن می‌شوند به صورت آرایه‌های انجمنی خواهند بود.

دسترسی به آبجکت‌های موجود در یک آرایه JSON

ساده‌ترین روش برای دسترسی به آبجکت‌های داخل یک آرایه JSON، استفاده از یک حلقه foreach برای تکرار پیمایش اعضای آرایه و فچ کردن داده‌های مورد نیاز است. به عنوان مثال، برای چاپ تمامی اسامی و شماره شناسه‌های سند JSON مثال ما:

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

این خروجی خواهد بود:

2, Steven Miller
3, Daniel James

دسترسی به اشیاء تودرتو در یک آرایه JSON

مقدار یک JSON می‌تواند یک شئ دیگر JSON باشد. در مثال ما، سه شئ JSON وجود دارند که هر یک متناظر با جزئیات مربوط به یک فرد هستند. برای هر شخص، یک کلید به نام favourite وجود دارد که مقدار آن یک شئ دیگر JSON است. شما می‌توانید به این شئ داخلی JSON دسترسی پیدا کنید همانطور که به یک آرایه انجمنی چند بعدی دسترسی پیدا می‌کنید. برای چاپ همه نام‌ها و رنگ‌های مورد علاقه متناظر با آنها:

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

خروجی:

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

دسترسی به آرایه‌های JSON در داخل JSON تودرتو

اگر یک آرایه در یک شئ JSON تودرتو داشته باشید، پس از دو حلقه foreach برای دستیابی به عنصر آرایه داخلی استفاده کنید. برای چاپ تمام اسامی و اتومبیل‌های متناظر با آنها:

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

خروجی:

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

در اینجا نمونه دیگری برای چاپ تعداد اتومبیل‌های هر شخص وجود دارد:

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

خروجی:

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

جستجوی یک JSON تودرتو با مقدار

تاکنون دیدیم که چگونه به همه اشیاء در سطح خاصی دسترسی پیدا کنیم. اکنون می‌آموزیم که چگونه یک JSON تودرتو را برای یک مقدار خاص جستجو کنیم. اولین مثال ما این است که تمام مالکین "Tesla" موجود در JSON نمونه خود را پیدا کنیم:

$search_val = 'Tesla';
foreach($json as $elem) {
   foreach ( $elem['cars'] as $car) {
      if($car['make'] == $search_val) {
         echo($elem['name']);
         echo("<br/>");
      }
   }
}

خروجی:

Steven Miller

در مثال بعدی، ما به دنبال افرادی هستیم که رنگ آبی را دوست دارند:

$search_val = 'Blue';
foreach($json as $elem) {
   foreach ( $elem['favourite'] as $key => $val) {
      if ($key == 'colour' && $val == $search_val) {
         echo($elem['name']);
         echo("<br/>");
      }
   }
}

خروجی:

Max Adams

جستجوی یک JSON تودرتو با کلید

در مثال بعدی ما به جای یک مقدار، کلید را جستجو می‌کنیم. به عنوان مثال برای پیدا کردن افرادی که اسباب بازی مورد علاقه دارند:

$search_key = 'toy';
foreach($json as $elem) {
   foreach ( $elem['favourite'] as $key => $val) {
      if ($key == $search_key) {
         echo($elem['name']." - ".$val);
      }
   }
}

خروجی:

Daniel James - Teddy

بازگشتی تمام کلیدها و مقادیر را می گیرید

حال به روش دیگری برای دسترسی به داده‌ها از یک JSON خودفراخوان تودرتو نگاه می‌کنیم. در این روش ما یک تابع را ایجاد می‌نماییم که خود را تا زمانی که شرایط خاصی برآورده شود، فراخوانی می‌نماید. بیایید با یک قطعه کد ساده برای چاپ تمام کلیدها و مقادیر موجود در سند نمونه JSON ما شروع کنیم.

// Define function
function print_recursive($arr){

  foreach ($arr as $key => $val) {
    if (is_array($val)) {
      print_recursive($val);

    } else {
       echo("$key = $val <br/>");
    }
  }
return;
}

// Call function
print_recursive($json);

در کد بالا، تابع print_recursive اگر مقدار یک آرایه باشد خود را فراخوانی می‌کند، در غیر این صورت کلید و مقدار را چاپ می‌کند. خروجی:

id = 1
name = Max Adams
born = 18 Dec 2005
make = Mercedes
model = GLS
make = Audi
model = Q8
colour = Blue
movie = Toy Story
id = 2
name = Steven Miller
...
...

جستجو با استفاده از کلید یا مقدار بازگشتی

می‌توانید با کمی تغییر در کد بالا، بر اساس کلید یا مقدار داخل JSON تودرتو جستجو کنید. تمام کاری که باید انجام دهید، تعریف یک تابع است که دو آرگومان می‌گیرد، یک آرایه و یک جفت کلید/مقدار. در این صورت همان بازگشت قبلی را اجرا می‌کنید اما باید شرط دیگری برای بررسی کلید / مقدار مشخص شده داشته باشید.

در اینجا مثالی برای به دست آوردن همه مدل‌های اتومبیل آورده شده است:

// Recursive function to search by key
function search_recursive_by_key($arr, $searchkey){

   foreach ($arr as $key => $val) {
      if (is_array($val)) {
         search_recursive_by_key($val, $searchkey);

      } else {
         if ($searchkey == $key) {
            echo("$key ||| $val <br/>");
         }
      }
   }
return;
}

// Call function with Key as second argument
search_recursive_by_key($json, 'model');

خروجی:

model ||| GLS
model ||| Q8
model ||| Model S
model ||| Chiron

به طور مشابه، می‌توانید یک مقدار را جستجو کنید. به عنوان مثال، برای پیدا کردن همه افرادی که در یک تاریخ خاص متولد شده‌اند:

// Recursive function to search by value
function search_recursive_by_value($arr, $searchval){

   foreach ($arr as $key => $val) {
      if (is_array($val)) {
         search_recursive_by_value($val, $searchval);
         } else {
         if ($searchval == $val) {
            echo("$key :: $val <br/>");
         }
      }
   }
return;
}
// Call function with value to search as second argument
search_recursive_by_value($json, '18 Dec 2005');

خروجی:

born :: 18 Dec 2005

جستجو بر اساس کلید و مقدار به صورت بازگشتی

در مثال‌های قبلی، شما در جستجوی یک کلید یا مقدار بودید و هنگامی که پیدا شد، آن زوج مقدار-کلید را تکرار کردید. اما در بیشتر مواقع ممکن است بخواهید یک کلید یا مقدار را جستجو کنید و گره والد یا یک زوج مقدار-کلید دیگر را تکرار کنید. به عنوان مثال، می‌خواهید یک تاریخ را جستجو کنید و نام کسی را که در آن تاریخ متولد شده است، تکرار کنید. یا، جستجو برای یک ماشین و گرفتن افرادی که آن ماشین را دارند. این تابعی است که می‌توان آن را انجام داد:

// Recursive function to search by Key and Value
function search_recursive_key_value($arr, $searchkey, $searchval, $result=null){

   foreach ($arr as $key => $val) {
      if (is_array($val)) {
           search_recursive_key_value($val, $searchkey, $searchval,  $result);

      } else {
           if ($key == $searchkey) {
              $result = $val;
           }

           if ($searchval == $val) {
              echo("$result => $val <br/>");
           }
      }
   }
return;
}
// Call function with a key to output and value to search
search_recursive_key_value($json, 'name', '28 Jul 2004');
search_recursive_key_value($json, 'make', 'Audi');

خروجی:

Steven Miller => 28 Jul 2004
Max Adams => Audi

PHP همچنین چندین کارکرد آرایه داخلی برای دریافت داده‌ها از JSON تودرتو فراهم می‌کند، هنگامی که رشته JSON به یک شئ پی‌اچ‌پی رمزگشایی شود.

Sara Jabbari

Sara Jabbari

دیدگاه‌ها


ثبت دیدگاه