PHP循环中合并数组遇阻:如何将作者信息嵌入新闻数组?
解决PHP中嵌套作者信息到新闻数组的问题
看起来你现在的核心需求是把作者信息嵌套进每条新闻的结构里,而不是和新闻平级,同时还要保证输出的JSON格式合法。咱们一步步来解决这个问题:
原代码的问题分析
- 你当前的代码每次循环都会创建一个新的
$json数组,把新闻对象和作者信息放在平级的位置,所以输出的每个JSON对象里authorDetail都在news外面。 - 每次循环直接
echo json_encode($json)会导致最终输出的是多个独立的JSON对象拼接在一起,这不是合法的JSON数组格式,前端解析会出问题。 - 你尝试
array_push和array_merge时出错,大概率是因为没有正确处理对象和数组的转换,或者目标变量的类型不对。
解决方案:嵌套作者信息到新闻结构里
我们可以通过两种方式实现嵌套,取决于你的$question是可修改的对象还是需要转成数组:
方法1:直接给新闻对象添加属性(推荐,如果$question是普通对象)
如果$question是从数据库查询返回的stdClass对象,直接给它新增一个authorDetail属性即可:
$query = $news->getNewsGrihaLimit($offset, 10); $newsCollection = []; // 用来收集所有带作者信息的新闻 if(is_array($query) || is_object($query)){ foreach($query as $question){ // 获取作者信息 $authorDetail = $writer->getAuthorById($question->id); // 直接把作者信息嵌套进新闻对象里 $question->authorDetail = $authorDetail; // 将处理好的新闻加入集合 $newsCollection[] = $question; } // 最后统一输出合法的JSON数组 echo json_encode(['newsList' => $newsCollection]); }
方法2:转成数组后合并(适合对象不可修改的场景)
如果$question是不可修改的对象,先把它转成数组,再合并作者信息:
$query = $news->getNewsGrihaLimit($offset, 10); $newsCollection = []; if(is_array($query) || is_object($query)){ foreach($query as $question){ $authorDetail = $writer->getAuthorById($question->id); // 将新闻对象转成数组 $newsArray = (array)$question; // 把作者信息嵌套进新闻数组 $newsArray['authorDetail'] = $authorDetail; $newsCollection[] = $newsArray; } echo json_encode(['newsList' => $newsCollection]); }
关于你之前尝试的array_push和array_merge报错的说明
array_push报错:如果当时你传入的第一个参数不是数组(比如是单个对象或者未初始化的变量),就会触发这个错误。需要确保目标变量是一个已经初始化的数组,再用array_push或者更简洁的$array[] = $item来添加元素。array_merge报错:如果$authorDetail返回的是对象而不是数组,array_merge会因为第二个参数不是数组而报错。这时候可以先把$authorDetail转成数组:$authorArray = (array)$authorDetail;,再和新闻数组合并。
这样修改后,每条新闻的结构里都会包含嵌套的authorDetail字段,而且最终输出的是合法的JSON数组,前端可以正常解析。
内容的提问来源于stack exchange,提问作者Lenna Smith
相关产品推荐
相关产品推荐

