如何在PHP中转置含2层和3层结构的多维关联数组
PHP实现混合层级数组按索引分组重构
需要将包含二维和三维结构的数组按索引分组,把同一索引的所有字段值组合成独立的变体对象,保持字段间的关联关系。
基础实现方案(适配示例结构)
直接针对示例中的固定字段结构编写代码,逻辑清晰易懂:
$variation = [ "sku" => [ 0 => "dSADad", 1 => "ASDAF", 2 => "ASFAS", ], "Price" => [ 0 => "1", 1 => "1", 2 => "1", ], "Quantity" => [ 0 => "123", 1 => "123", 2 => "123434", ], "attributes" => [ "Color" => [ 0 => "5", 1 => "4", 2 => "4", ], "Size" => [ 0 => "3", 1 => "3", 2 => "2", ], "Material" => [ 0 => "7", 1 => "7", 2 => "8", ], ], ]; // 获取变体总数(假设所有字段的数组长度一致) $variantCount = count($variation['sku']); $variations = []; for ($i = 0; $i < $variantCount; $i++) { // 构建当前变体的基础字段 $variant = [ 'sku' => $variation['sku'][$i], 'Price' => $variation['Price'][$i], 'Quantity' => $variation['Quantity'][$i], 'attributes' => [] ]; // 填充属性字段 foreach ($variation['attributes'] as $attrName => $attrValues) { $variant['attributes'][$attrName] = $attrValues[$i]; } $variations[] = $variant; } // 输出结果 print_r($variations);
代码说明
- 通过
count($variation['sku'])获取变体的总数,前提是所有字段的数组长度保持一致。 - 循环每个索引,逐个构建独立的变体对象:
- 直接提取
sku、Price、Quantity对应索引的值。 - 遍历
attributes下的子属性,将对应索引的值填充到当前变体的属性集合中。
- 直接提取
- 将每个变体对象加入结果数组,最终得到目标结构。
通用实现方案(适配任意混合层级)
如果数组结构可能有变化(比如顶层字段增减),可以使用更通用的代码,自动识别二维/三维字段并处理:
$variantCount = count(reset($variation)); // 自动获取第一个顶层数组的长度 $variations = []; for ($i = 0; $i < $variantCount; $i++) { $variant = []; foreach ($variation as $key => $values) { if (is_array($values) && isset($values[$i])) { // 判断当前字段是二维数组还是三维数组 if (!is_array(reset($values))) { // 二维数组:直接取对应索引的值 $variant[$key] = $values[$i]; } else { // 三维数组:遍历子属性并取对应索引的值 $variant[$key] = []; foreach ($values as $subKey => $subValues) { $variant[$key][$subKey] = $subValues[$i]; } } } } $variations[] = $variant; } print_r($variations);
代码说明
- 使用
reset($variation)自动获取第一个顶层数组,通过count得到变体总数,无需硬编码字段名。 - 遍历顶层所有字段,自动判断字段类型:
- 若为二维数组(如
sku),直接提取对应索引的值。 - 若为三维数组(如
attributes),遍历子属性并提取对应索引的值。
- 若为二维数组(如
- 最终生成的结果数组与目标结构完全一致,同时具备更好的扩展性。
内容的提问来源于stack exchange,提问作者Adrian Costache
相关产品推荐
相关产品推荐

