PHP(Laravel)中使用Foreach从数组获取多元素字符串的问题
问题分析与解决方案
首先得指出你第一个用foreach的代码问题出在哪:你在循环里每次把$re直接覆盖成当前元素的item_id,循环结束后$re自然只剩最后一次循环的那个值,这就是为什么Postman只返回单个"77178"的原因。
下面给你两种能实现目标格式的正确写法:
方法一:基于array_column的简化实现
既然你第二个方法里用array_column已经能正确拿到9个item_id的数组,那我们直接在此基础上调整成你要的字符串格式就行:
private function itemNotReco($paramsUserId = null) { try{ $result = DB::connection('read')->table('recommendation_events') ->where('user_id', $paramsUserId); if ($result) { $result = $result->distinct()->get(['item_id']); } // 先提取所有item_id到数组 $itemIds = array_column($result, 'item_id'); // 给每个ID加上双引号,再用逗号拼接成字符串 $formattedStr = implode(', ', array_map(function($id) { return "\"$id\""; }, $itemIds)); return $formattedStr; } catch (\Exception $e) { $log = ['Service' => 'RecommendationEventService', 'function' => 'getItemNotRecommendation']; logError($e, $log); } }
方法二:修正你的foreach写法
如果你坚持想用foreach来收集数据,得先初始化一个空数组,把每个item_id追加进去,而不是直接覆盖变量:
private function itemNotReco($paramsUserId = null) { try{ $result = DB::connection('read')->table('recommendation_events') ->where('user_id', $paramsUserId); if ($result) { $result = $result->distinct()->get(['item_id']); } $itemIds = []; foreach ($result as $re){ $itemIds[] = $re->item_id; // 把每个ID追加到数组里 } // 同样处理成目标格式 $formattedStr = implode(', ', array_map(function($id) { return "\"$id\""; }, $itemIds)); return $formattedStr; } catch (\Exception $e) { $log = ['Service' => 'RecommendationEventService', 'function' => 'getItemNotRecommendation']; logError($e, $log); } }
额外小技巧
Laravel的查询构造器其实有更简洁的写法,用pluck可以直接替代get+array_column,一步拿到item_id的数组:
$itemIds = $result->distinct()->pluck('item_id')->toArray();
两种方法最终都会返回你期望的格式:"77196", "77263", "77202", "77262", "77275", "77259", "77345", "77329", "77178"
内容的提问来源于stack exchange,提问作者jasonfrdy72
相关产品推荐
相关产品推荐

