PHP提取JSON对象前6个键触发foreach参数无效警告,求解决方案
我来帮你理清问题并解决这个报错:
为什么会触发Invalid argument supplied for foreach()警告?
你当前请求的是单个人物的详情API(比如https://swapi.co/api/people/1/),返回的JSON是一个单独的人物对象,结构是这样的:
{ "name":"Luke Skywalker", "height":"172", "mass":"77", ... }
这个JSON里根本没有results这个顶级键,所以$array['results']会返回null,而foreach无法遍历null,自然就抛出警告了。
你之前的错误是混淆了「人物列表API」(返回带results数组的JSON)和「单个人物详情API」的结构。
实现仅提取前6个键的解决方案
针对单个人物详情的场景,我们可以通过两种方式获取前6个键值对:
方法1:用array_slice直接截取数组前6项
array_slice可以快速从关联数组中提取指定范围的元素,代码如下:
<hr> <h3>Details</h3> <?php $id = $_POST['id']; $url = "https://swapi.co/api/people/" . $id . "/"; $json = file_get_contents($url); $array = json_decode($json, true); // 提取数组的前6个键值对 $top6Fields = array_slice($array, 0, 6); foreach($top6Fields as $key => $value){ ?> <span><?php echo ucfirst($key);?> : <?php echo $value; ?></span> <br> <?php } ?>
方法2:循环时计数,到第6项就终止
如果需要更灵活的控制(比如中途跳过某些字段),可以手动计数:
<hr> <h3>Details</h3> <?php $id = $_POST['id']; $url = "https://swapi.co/api/people/" . $id . "/"; $json = file_get_contents($url); $array = json_decode($json, true); $fieldCount = 0; foreach($array as $key => $value){ // 已经提取6个字段就跳出循环 if($fieldCount >= 6) break; ?> <span><?php echo ucfirst($key);?> : <?php echo $value; ?></span> <br> <?php $fieldCount++; } ?>
额外说明
如果你原本是想处理人物列表API(比如https://swapi.co/api/people/)的前6个人物,那代码需要调整为遍历$array['results'],再对每个人物对象提取前6个键,但结合你当前的代码逻辑(点击人物展示详情),上面的方案才是符合需求的。
内容的提问来源于stack exchange,提问作者daultimate
相关产品推荐
相关产品推荐

