You need to enable JavaScript to run this app. CodeIgniter处理ajax传多维数组的方法及冗余传值优化咨询
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter处理ajax传多维数组的方法及冗余传值优化咨询

优化后的实现方案

1. 前端传参结构精简

你当前的传参方式存在两个核心问题:

  • 冗余度高:把相同的subject、message字段重复绑定到每个用户id对应的对象里,平白增加传输体积
  • 逻辑隐患:如果按照示例生成数组,会出现内容完全重复的条目,后端处理时很容易对同一个用户重复发送消息
    完全不需要用嵌套的多维对象传参,直接拆成三个独立的POST参数传递即可,结构清晰无冗余:
  • user_ids:存放所有选中复选框对应用户id的数组
  • subject:单条主题字符串
  • message:单条消息内容字符串

2. 修改后的前端Ajax代码

你现有代码还有个隐藏bug:组装完data对象后,根本没有把它传入Ajax请求的data配置项,实际发送的POST请求不会携带任何业务参数。
优化后的完整可运行代码:

$(document).on('click', '.send_btn', function(e) { 
  e.preventDefault();
  // 收集选中的用户id
  let selectedIds = [];
  $(':checkbox[name="people_checked[]"]:checked').each(function() {
    selectedIds.push($(this).val() || this.id);
  });
  // 组装精简的传参对象
  let postData = {
    user_ids: selectedIds,
    // 实际项目中从页面表单取值即可,这里写死的是你示例里的测试值
    subject: 'test subject',
    message: 'test message'
  };

  $.ajax({
    url: "/message/send_message",
    method: "POST",
    data: postData, // 显式传入组装好的业务参数
    dataType: "json",
    success: function (res) {
      console.log('请求成功返回:', res);
    },
    error: function(err) {
      console.error('请求失败:', err);
    }
  }) 
});

3. CodeIgniter控制器端处理逻辑

你之前误以为$this->input->post()拿不到数组类参数是错误的,这个方法完全支持接收任意类型的POST值,包括数组和嵌套数组。
对应的控制器处理代码示例:

<?php
// application/controllers/Message.php
class Message extends CI_Controller {
  public function send_message()
  {
    // 获取参数,第二个参数为TRUE表示开启输入安全过滤
    $subject = $this->input->post('subject', TRUE);
    $message = $this->input->post('message', TRUE);
    $userIds = $this->input->post('user_ids', TRUE);

    // 前置校验:未选中任何用户时直接返回错误
    if (empty($userIds) || !is_array($userIds)) {
      echo json_encode(['code' => 400, 'msg' => '请先选择需要接收消息的用户']);
      return;
    }

    // 遍历id数组批量写入消息,公共的subject、message只需引用一次
    foreach ($userIds as $userId) {
      // 此处替换为你的实际业务逻辑,例如调用模型写入消息表
      // $this->message_model->insert([
      //   'receiver_id' => $userId,
      //   'subject' => $subject,
      //   'content' => $message,
      //   'create_time' => time()
      // ]);
    }

    // 返回处理结果给前端
    echo json_encode([
      'code' => 200,
      'msg' => "消息已成功发送给" . count($userIds) . "位用户"
    ]);
  }
}

关于Ajax发送多个独立数组的问题

完全支持。只要在前端组装POST参数时,给每个数组分配独立的键名即可,控制器端不需要做特殊适配,直接通过对应的键名就能获取:

// 同时传两个数组的示例
let postData = {
  user_ids: [1, 2, 3], // 第一个数组:接收消息的用户id列表
  attach_ids: [11, 22], // 第二个数组:消息携带的附件id列表
  subject: '测试主题',
  message: '测试内容'
}

对应的控制器中,通过$this->input->post('attach_ids')即可直接拿到第二个数组的内容。

内容的提问来源于stack exchange,提问作者XxnumbxX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 03:45:09