You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比两个数组,实现用户更新分类时标记选中状态?

解决用户分类选中状态标记问题

我来帮你搞定这个给分类添加选中状态标记的需求!首先咱们先理清楚核心需求:从USER表拿到用户之前选中的分类ID,然后遍历CATEGORY表的所有分类,给每个分类加上checked字段——用户已选的设为1,未选的设为0。

现有代码的问题

你当前的代码把已选分类和全部分类分成了两个独立的数组返回,但没有完成合并标记checked的核心操作,而且代码里的循环逻辑有点冗余,还存在SQL注入风险(直接拼接user_id到SQL语句里)。

优化后的代码

咱们直接修改代码,一步到位生成带checked标记的分类列表:

case 'cat':
    // 1. 先获取用户已选的分类ID,存成一维数组(更高效判断)
    $selectedCats = [];
    // 使用预处理语句防止SQL注入
    $sql = "SELECT category from nesbaty_user where user_id=?";
    $stmt = mysqli_prepare($con, $sql);
    mysqli_stmt_bind_param($stmt, "s", $user_id);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    
    if ($array = mysqli_fetch_array($result)) {
        // 把逗号分隔的字符串转成一维数组
        $selectedCats = explode(',', $array['category']);
        // 转成字符串数组(确保和cat_id类型一致)
        $selectedCats = array_map('strval', $selectedCats);
    }

    // 2. 查询全部分类,并添加checked标记
    $qry = "SELECT cat_id, category, image_url FROM nesbaty_category";
    $qry_res = mysqli_query($con, $qry);
    $categoryList = [];
    
    while ($array = mysqli_fetch_assoc($qry_res)) {
        // 判断当前分类ID是否在已选列表中
        $array['checked'] = in_array($array['cat_id'], $selectedCats) ? 1 : 0;
        $categoryList[] = $array;
    }

    // 3. 返回处理后的结果
    $response['category'] = $categoryList;
    // 如果需要保留已选分类列表也可以加上
    $response['Selected_category'] = array_map(function($id) {
        return ['category' => $id];
    }, $selectedCats);
    
    echo json_encode($response);
    // mysqli_close($con);
    break;

代码说明

  • SQL注入防护:用预处理语句替代直接拼接参数,避免安全风险;
  • 高效判断:把已选分类转成一维字符串数组,用in_array快速判断是否选中;
  • 状态标记:遍历全部分类时,给每个分类添加checked字段,直接返回带标记的结果,前端可以直接使用;
  • 类型统一:用array_map('strval', $selectedCats)确保已选ID和cat_id都是字符串类型,避免类型不一致导致的判断错误。

示例返回结果

修改后返回的JSON会变成这样(以你提供的示例数据为例):

{
  "category": [
    {
      "cat_id": "1",
      "category": "Drug",
      "image_url": "1.jpg",
      "checked": 0
    },
    {
      "cat_id": "2",
      "category": "Bars",
      "image_url": "2.jpg",
      "checked": 0
    },
    {
      "cat_id": "3",
      "category": "Bars",
      "image_url": "2.jpg",
      "checked": 0
    },
    {
      "cat_id": "4",
      "category": "Hair Saloon",
      "image_url": "2.jpg",
      "checked": 0
    }
  ],
  "Selected_category": [
    {"category": "5"},
    {"category": "6"},
    {"category": "9"}
  ]
}

这样前端拿到数据后,就能直接根据checked字段来渲染分类的选中状态啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:48:22