如何对比两个数组,实现用户更新分类时标记选中状态?
解决用户分类选中状态标记问题
我来帮你搞定这个给分类添加选中状态标记的需求!首先咱们先理清楚核心需求:从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
相关产品推荐
相关产品推荐

