PHP REST API数组返回异常:值被覆盖且会话数组为空
问题分析与解决方案
看起来你遇到了两个核心问题:一是循环中变量被覆盖导致只返回最后一个活动的会话,二是会话数组为空(大概率和第一个问题相关,也可能模型查询存在逻辑问题)。咱们一步步来修复:
核心问题1:循环逻辑错误
你的foreach循环没有添加花括号{},这意味着只有$activity_id = $activity->activity_id;这一行会被循环执行,而后面的$data['activity_session'] = ...只会在循环结束后执行一次。最终$activity_session只会存储最后一个活动的会话数据——如果最后一个活动没有会话,自然就返回空数组了。
核心问题2:会话数据未与对应活动关联
你需要把每个活动的会话数据和活动本身绑定,或者单独整理成一个以活动ID为键的数组,这样前端才能对应上每个活动的会话信息。
修正后的代码
下面是调整后的完整代码,我标注了关键修改点:
function get_all_activity_by_category(){ $id = $this->input->get('id'); $data['activity_category'] = $this->users_model->single_activity_category($id); $activity_category = $data['activity_category']; $data['activities_by_category'] = $this->users_model->list_of_activities($id); $activities_by_category = $data['activities_by_category']; // 初始化数组,存储每个活动的会话(以活动ID为键) $activity_sessions = []; // 给foreach加上花括号,确保循环内代码每次都执行 foreach($activities_by_category as $activity) { $activity_id = $activity->activity_id; // 将每个活动的会话按ID存入数组 $activity_sessions[$activity_id] = $this->users_model->search_sessions_by_activity($activity_id); // 可选优化:把会话直接附加到活动对象中,前端可通过activity.session直接获取 // $activity->session = $this->users_model->search_sessions_by_activity($activity_id); } header('Access-Control-Allow-Origin: *'); header('Content-Type: application/json'); return $this->output ->set_content_type('application/json') ->set_status_header(200) // 返回整理好的会话数组 ->set_output(json_encode( array( 'activity_category'=>$activity_category, 'activity'=>$activities_by_category, 'activity_session'=>$activity_sessions ), JSON_UNESCAPED_SLASHES )); }
额外排查点(如果仍返回空数组)
如果调整后会话数组依然为空,你需要检查:
- 确认
search_sessions_by_activity模型方法是否正确接收$activity_id参数,SQL查询是否存在拼写错误(比如字段名、表名)或WHERE条件逻辑错误 - 手动在数据库中执行查询,确认对应活动ID确实存在会话数据
- 可以在循环中临时添加
var_dump($activity_id);和var_dump($this->users_model->search_sessions_by_activity($activity_id));,查看每次查询的结果是否符合预期
内容的提问来源于stack exchange,提问作者Raza Barlas




