PHP技术问题:为何仅输出数组最后一个值?
问题原因分析与解决方案
嘿,我来帮你拆解下这个问题——这种循环生成数组却只输出最后一条数据的情况,在PHP处理JSON时真的是高频踩坑点!结合你的描述,大概率是以下几个原因之一:
数组赋值时覆盖而非追加
这是最常见的问题!如果你的代码里是每次循环都直接给数组变量重新赋值(而不是往数组里加元素),那最后自然只会保留最后一次循环的结果。比如错误写法:$reviewData = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 这里直接覆盖了整个$reviewData,而不是追加 $reviewData = [ "category" => $row['category'], "name" => $row['name'], "phone" => $row['phone'], "comment" => $row['comment'], "reviewid" => $row['review_id'] ]; } echo json_encode([$reviewData]);正确的做法是用
$reviewData[] = ...来追加元素:$reviewData = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 往数组末尾添加新的元素 $reviewData[] = [ "category" => $row['category'], "name" => $row['name'], "phone" => $row['phone'], "comment" => $row['comment'], "reviewid" => $row['review_id'] ]; } echo json_encode($reviewData);SQL查询只返回了单条数据
有时候问题不在PHP代码,而是你的SQL语句本身就只拿到了最后一条记录。比如不小心加了LIMIT 1,或者WHERE条件写错了,导致数据库只返回review_id=76的那条。你可以在执行查询后,先打印下查询结果的数量,比如用echo $stmt->rowCount();看看是不是等于2,或者直接输出原始的查询结果,确认数据是否正确。变量作用域错误
如果你的数组变量是在循环内部定义的,那每次循环都会重新初始化这个数组,最后也只会保留最后一次循环的内容。比如:while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 每次循环都新建一个空数组,之前的内容全丢了 $reviewData = []; $reviewData[] = [...]; } echo json_encode($reviewData);解决方法很简单:把
$reviewData = [];移到循环外面去。JSON编码的隐性错误
虽然概率较低,但如果某条数据里有无法JSON编码的内容(比如特殊字符、非UTF-8编码的字符串),可能导致编码失败,但PHP默认不会报错,反而可能只输出部分内容。你可以加个错误检测:$json = json_encode($reviewData); if ($json === false) { die('JSON编码失败:' . json_last_error_msg()); } echo $json;
先从第一个原因排查,这几乎是90%以上这类问题的根源!
内容的提问来源于stack exchange,提问作者CHarris
相关产品推荐
相关产品推荐

