PHP如何将数组中同一地点的多条评分拼接为字符串存入数据库
问题根因
你的代码存在3个核心问题导致功能异常:
$ratingString = array();初始化语句放在了foreach循环内部,每次循环都会清空之前存储的所有数据,因此第二次处理ID=1234的记录时,数组已被重置,每次都会命中未初始化的else分支- else分支额外加了
if($location['id'] == 1234)的限制,其他地点的记录不会初始化对应数组元素,无法适配全量地点 - 初始化时直接存储int类型的评分,虽然PHP弱类型自动转换不会直接报错,但统一存储字符串更符合后续拼接的逻辑
修复方案
基础版(直接拼接)
将数组初始化移到循环外部,去掉ID限制即可:
// 数组初始化放在循环外,全局只执行一次 $ratingString = []; // 这里替换成你实际的遍历逻辑,比如遍历所有地点+评分的关联记录 foreach ($yourOriginData as $item) { $locationId = $item['location']['id']; $rating = $item['rating']; // 本次循环拿到的单条评分值 if (isset($ratingString[$locationId])) { // 已存在对应地点的记录,直接拼接评分 $ratingString[$locationId]['ratingString'] .= ',' . $rating; } else { // 首次处理该地点,初始化字符串 $ratingString[$locationId]['ratingString'] = (string)$rating; } } // 后续遍历$ratingString,将每个地点的ratingString存入对应数据库字段即可
优化版(更灵活,支持去重/排序)
如果后续需要对评分做去重、排序等处理,推荐先存为数组最后再统一拼接:
$ratingTemp = []; foreach ($yourOriginData as $item) { $locationId = $item['location']['id']; $rating = $item['rating']; if (!isset($ratingTemp[$locationId])) { $ratingTemp[$locationId] = []; } // 需要去重的话可以打开下面这行注释 // if (in_array($rating, $ratingTemp[$locationId])) continue; $ratingTemp[$locationId][] = $rating; } // 统一转为逗号分隔的字符串 $ratingString = []; foreach ($ratingTemp as $locationId => $ratings) { // 需要排序的话可以先对$ratings做sort处理 $ratingString[$locationId]['ratingString'] = implode(',', $ratings); }
后续使用提示
后续从数据库取出拼接好的评分字符串后,用explode(',', $ratingStr)即可直接转回数组使用。
内容的提问来源于stack exchange,提问作者Lochness
相关产品推荐
相关产品推荐

