检查 JSON 字段的子字段是否包含值 (PHP)

Check if any of a JSON's field's subfield contains a value (PHP)

我想检查 JSON 字段的任何子字段是否包含字符串。我事先不知道子字段的数量。

特别是,我想看看有没有...

$obj['message']['license'][**0**]['URL']
$obj['message']['license'][**1**]['URL']
$obj['message']['license'][**2**]['URL']
$obj['message']['license'][**3**]['URL']
$obj['message']['license'][**XYZ**]['URL']

...(其中 XYZ 可以是任何数字,具体取决于 license 字段下的子字段数)包含值 creativecommons.

如果是,则名为 $oa_lic 的变量应为包含 creativecommons 的值,否则 $oa_lic 应为 NULL.

示例 1:在 https://api.crossref.org/works/10.1002/poi3.263$oa_lic 应该是 NULL

示例 2:在 https://api.crossref.org/works/10.1016/j.polgeo.2021.102404$oa_lic 应该是 http://creativecommons.org/licenses/by/4.0/

如果 XYZ 仅仅是 0:

,我已经有了这样做的代码
<?php
$crossrefurl = "https://api.crossref.org/works/10.1016/j.polgeo.2021.102404";

// make request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $crossrefurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$obj = json_decode($output, true);

if(!isset($obj['message']['license'][0]['URL'])) {
    echo '<p><u>OA License</u>: none</p>';
    $oa_lic = NULL;
}
else {
  if(isset($obj['message']['license'][0]['delay-in-days'])) {
    if($obj['message']['license'][0]['delay-in-days'] == 0) {
      if(strpos($obj['message']['license'][0]['URL'], 'creativecommons') !== false) {
        $oa_lic = $obj['message']['license'][0]['URL'];
        echo '<p><u>OA License</u>: '.$oa_lic.'</p>';
      }
      else {
        $oa_lic = NULL;
        echo '<p><u>OA License</u>: there is a license, but it is not Creative Commons</p>';
      }
    }
  }
  else {
    $oa_lic = NULL;
    echo '<p><u>OA License</u>: there seems to be an embargo?</p>';
  }
}

但是如何有效地统计 licenses 下的子字段数量,然后检查它们的任何子字段 URL 是否包含字符串 creativecommons?

感谢您的帮助!

遍历 $obj['message']['license'],然后使用 count($obj['message']['license']) 获取元素计数。知道这个计数值后,你就可以用它做你想做的事了。