You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel Excel中将数组值从单列转换为多列?

问题描述

我在使用Laravel-Excel生成报表时,希望将截图中标记的$item_name列对应的数组值分别展示在不同列,而非合并成单列。我已经尝试过foreach循环、implode和array_map方法,但没能实现预期效果,相关代码如下:

if($customer_type == 2)
    {
        $excel_data_attribute = array(
            array('Distributor Customer')
        );

        if ($show_type == 0)
        {
            $excel_data_attribute_array = array(
                array('Sales Sheet - Quanty Wise')
            );
        }elseif($show_type == 1)
        {
            $excel_data_attribute_array = array(
                array('Sales Sheet - Price Wise')
            );
        }else
        {
            $excel_data_attribute_array = array(
                array('Sales Sheet - Cartoon Quanty Wise')
            );
        }
        $excel_dynamic_data_array = array();
        $index=0;
        foreach ($productGroup as $gKey => $group )
        {
            $col_[$gKey] = false;
            foreach($all_product as $pkey => $product)
            {
                if($productGroup[$gKey]["id"] == $product->product_group_id)
                {
                    $col_[$gKey] = true;
                }
            }
            if($col_[$gKey])
            {
                $product_Names_with_keys = $productGroup[$gKey]["t_product"].$productGroup[$gKey]['gorupName'];

                $excel_dynamic_data_array[$index][] = $productGroup[$gKey]['gorupName'];
                $index++;
            }
        }
        $item  = $excel_dynamic_data_array;

        $item_name = implode(', ', array_map(function ($entry) {
                                                return ($entry[key($entry)]);
                                            }, $item));
        if($summery == 1)
        {
            $excel_data_attribute_array_column = array(
                array('SL','Region & Rsm',$item_name,'Total')
            );
        }else
        {
            if ($customer_type == 2)
            {
                $excel_data_attribute_array_column = array(
                    array('SL','Order No','Order Date','Challan No','Challan Date','Bill No','Party Name','Area',$item_name,'Total')
                );

            }else
            {
                $excel_data_attribute_array_column = array(
                    array('SL','Order No','Order Date','Bill No','Party Name','Area',$item_name,'Total')
                );
            }
        }
        $total_final_array = array_merge($excel_data_attribute,$excel_data_attribute_array,$excel_data_attribute_array_column);
    }
   return collect($total_final_array); 
解决方案

问题核心是你用implode(', ', ...)把所有分组名称合并成了单个字符串,导致最终只能显示为单列。需要直接将分组名称数组拆解为独立元素,插入到表头数组的对应位置。

修改后的代码如下:

if($customer_type == 2)
{
    $excel_data_attribute = [['Distributor Customer']];

    // 用match简化多分支判断
    $excel_data_attribute_array = match($show_type) {
        0 => [['Sales Sheet - Quanty Wise']],
        1 => [['Sales Sheet - Price Wise']],
        default => [['Sales Sheet - Cartoon Quanty Wise']]
    };

    $groupNames = [];
    foreach ($productGroup as $group )
    {
        // 简化分组是否有对应产品的判断逻辑
        $hasProduct = collect($all_product)->contains(function($product) use ($group) {
            return $product->product_group_id == $group["id"];
        });
        
        if($hasProduct)
        {
            // 注意:原代码中gorupName疑似拼写错误,建议检查是否为groupName
            $groupNames[] = $group['gorupName'];
        }
    }

    if($summery == 1)
    {
        // 将分组名称数组拆分为独立列,合并到表头中
        $excel_data_attribute_array_column = [
            array_merge(['SL','Region & Rsm'], $groupNames, ['Total'])
        ];
    }else
    {
        if ($customer_type == 2)
        {
            $excel_data_attribute_array_column = [
                array_merge(['SL','Order No','Order Date','Challan No','Challan Date','Bill No','Party Name','Area'], $groupNames, ['Total'])
            ];
        }else
        {
            $excel_data_attribute_array_column = [
                array_merge(['SL','Order No','Order Date','Bill No','Party Name','Area'], $groupNames, ['Total'])
            ];
        }
    }
    $total_final_array = array_merge($excel_data_attribute,$excel_data_attribute_array,$excel_data_attribute_array_column);
}
return collect($total_final_array); 

关键修改说明

  1. 去掉了冗余的$excel_dynamic_data_array和复杂的array_map处理,直接收集符合条件的分组名称到一维数组$groupNames
  2. 使用array_merge将$groupNames的每个元素作为独立列插入表头数组,实现每个分组名称单独占一列的效果
  3. 用collect($all_product)->contains()简化了原有的嵌套foreach判断,代码更简洁易读
  4. 提示:原代码中gorupName可能是拼写错误,请根据实际数据库字段名调整为groupName

内容的提问来源于stack exchange,提问作者Anika Tabassum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:30:42