PHP中如何提取__typename为Clip且name非空的JSON的sourceUrl
问题:从JSON数据中提取符合条件的sourceUrl值
需求:使用PHP从JSON数据集中提取sourceUrl值,需满足两个条件:
- JSON对象的
__typename字段为"Clip" name字段不为空
尝试了以下代码但未得到任何结果:
<?php $json_url = 'https://jsonblob.com/api/jsonBlob/1154143677919911936'; $json_data = file_get_contents($json_url); $data = json_decode($json_data, true); $sourceUrls = []; foreach ($data as $key => $value) { if ( isset($value['sourceUrl']) && isset($value['__typename']) && isset($value['name']) && $value['__typename'] === 'Clip' && $value['name'] !== '' ) { $sourceUrls[] = $value['sourceUrl']; } } if (!empty($sourceUrls)) { foreach ($sourceUrls as $sourceUrl) { echo 'sourceUrl: ' . $sourceUrl . '<br>'; } } else { echo 'none.'; } ?>
问题原因
你提供的JSON数据结构中,目标对象并不在顶层,而是嵌套在edges数组的node字段下。原代码直接遍历顶层$data,无法访问到实际包含__typename、name和sourceUrl的对象。
修正后的代码
<?php $json_url = 'https://jsonblob.com/api/jsonBlob/1154143677919911936'; $json_data = file_get_contents($json_url); $data = json_decode($json_data, true); $sourceUrls = []; // 先获取edges数组,遍历每个edge节点 if (isset($data['edges']) && is_array($data['edges'])) { foreach ($data['edges'] as $edge) { // 取出每个edge里的node对象 $node = $edge['node'] ?? []; if ( isset($node['sourceUrl']) && isset($node['__typename']) && isset($node['name']) && $node['__typename'] === 'Clip' && trim($node['name']) !== '' // 用trim避免空白字符的情况 ) { $sourceUrls[] = $node['sourceUrl']; } } } if (!empty($sourceUrls)) { foreach ($sourceUrls as $sourceUrl) { echo 'sourceUrl: ' . $sourceUrl . '<br>'; } } else { echo 'none.'; } ?>
关键修改点
- 先判断并访问
$data['edges']数组,定位到目标数据所在层级 - 遍历每个
edge时,取出node对象进行条件判断 - 增加
trim()处理name字段,避免仅包含空白字符的情况被误判为非空
内容的提问来源于stack exchange,提问作者Meganek332
相关产品推荐
相关产品推荐

