使用Foreach为循环数据分配数组键:保留variant_id作为键的解决方案
问题
我希望通过新数组整理数据,在分配数组时将variant_id作为数组键。但当前操作后,数组键从0开始,未保留variant_id,请问解决方案是什么?
相关PHP代码
$variantList = $this->variants; $variantOne = []; $variantTwo = []; $variantThree = []; foreach ($variantList as $value){ if ($value->variant->type === 1){ $variantOne[$value->variant_id] = $value->variant_option; } if ($value->variant->type === 2){ $variantTwo[$value->variant_id] = $value->variant_option; } if ($value->variant->type === 3){ $variantThree[$value->variant_id] = $value->variant_option; } }
当前输出
{ "variantOne": [ "BMW", "213" ], "variantTwo": [ "Yeni", "erwe" ], "variantThree": [ "2024" ] }
需求
输出的数组需以variant_id作为键名,而非默认的数字索引。
解决方案
你的代码赋值逻辑本身没问题,问题出在后续转JSON的环节:当PHP关联数组的键是连续数字时,json_encode默认会把它转成JSON数组(数字索引),而非保留自定义键名的JSON对象。
方法1:转JSON时强制转为对象
在生成JSON输出时,添加JSON_FORCE_OBJECT参数,强制让所有数组转为JSON对象,保留variant_id键名:
// 组合三个数组并转JSON $result = [ 'variantOne' => $variantOne, 'variantTwo' => $variantTwo, 'variantThree' => $variantThree ]; echo json_encode($result, JSON_FORCE_OBJECT);
输出示例(假设variant_id分别为101、102等):
{ "variantOne": { "101": "BMW", "102": "213" }, "variantTwo": { "201": "Yeni", "202": "erwe" }, "variantThree": { "301": "2024" } }
方法2:给键名添加前缀(避免连续数字键)
如果不想强制转对象,可以给variant_id加前缀,让键名变成非纯数字格式,json_encode会自动保留键名:
foreach ($variantList as $value){ if ($value->variant->type === 1){ $variantOne['vid_' . $value->variant_id] = $value->variant_option; } if ($value->variant->type === 2){ $variantTwo['vid_' . $value->variant_id] = $value->variant_option; } if ($value->variant->type === 3){ $variantThree['vid_' . $value->variant_id] = $value->variant_option; } }
输出示例:
{ "variantOne": { "vid_101": "BMW", "vid_102": "213" }, "variantTwo": { "vid_201": "Yeni", "vid_202": "erwe" }, "variantThree": { "vid_301": "2024" } }
内容的提问来源于stack exchange,提问作者İsmail Berkay Kara
相关产品推荐
相关产品推荐

