Проблема PHPExcel с многомерным массивом и созданием сгруппированных данных - PullRequest
0 голосов
/ 18 января 2019

Мой текущий массив, который зацикливается, сбрасывает эту структуру

0 => array:11 [▼
  "category_code" => "123"
  "category_name" => "Testing"
  "category_description" => "This is a test category"
  19738 => array:5 [▼
    "identifier" => "720368842943"
    "description" => Test Description One
    "count" => 4
    "details" => array:2 [▼
      0 => array:3 [▼
        "detail_code" => "2751"
        "detail_code2" => "43"
        "detail_specifier" => "Detail One"
      ]
      1 => array:3 [▼
        "detail_code" => "2681"
        "detail_code2" => "9"
        "detail_specifier" => "Detail Two"
      ]
    ]
    "prices" => array:1 [▼
      "01" => "1129.00"
    ]
  ]
  19739 => array:5 [▼
    "identifier" => "720368844121"
    "description" => "Test Description Two"
    "count" => 4
    "details" => array:2 [▼
      0 => array:3 [▼
        "detail_code" => "2751"
        "detail_code2" => "43"
        "detail_specifier" => "Detail One"
      ]
      1 => array:3 [▼
        "detail_code" => "2681"
        "detail_code2" => "9"
        "detail_specifier" => "Detail Two"
      ]
    ]
    "prices" => array:1 [▼
      "01" => "1490.00"
    ]
  ]

Но при экспорте в Excel отображаются только три атрибута верхнего уровня

123  |  Testing  |  This is a test category

Я пытаюсь экспортировать это таким образом, чтобы эти три верхних значения были одной строкой (например, заголовок), а все связанные продукты перечислены под ним следующим образом:

123  |  Testing  |  This is a test category
====================================================================================================================
19738  |  720368842943  |  Test Description One  |  4  |  2751  |  43  |  Detail One  |  2681  |  9  |  Detail Two  |  1129.00
19739  |  720368844121  |  Test Description Two  |  4  |  2751  |  43  |  Detail One  |  2681  |  9  |  Detail Two  |  1490.00

Я использую Laravel Excel от maatwebsite, который является просто оболочкой для PHPExcel в laravel, но все, что я хочу сделать, это просто взять информацию о категории в виде строки с последующей информацией о продукте в виде строк под ней.

Вот код Excel с массивом, который я использую, который приведен выше (Код элемента - значения 19738,19739)

$allCategoryResult= array();

foreach($prices->categories as $category){ 
    $categoryItem = array(); 
    $categoryItem["category_code"] = $category->category_code;
    $categoryItem["category_name"] = $category->category_name; 
    $categoryItem["category_desc"] = $category->category_desc;

    foreach($category->skus as $sku){
        $skuItem = array(); 

        $skuItem["identifier"] = $sku->sku_info->identifier;
        $skuItem["description"] = $sku->sku_info->item->description;
        $skuItem["count"] = $sku->sku_info->item->item_type->count;

        $skuItem["details"] = array(); 
        foreach ($sku->sku_info->details as $details) {
            $detailsItem = array(); 
            $detailsItem["detail_code"] = $details->detail_code;
            $detailsItem["detail_code2"] = $details->detail_code2;
            $detailsItem["detail_specifier"] = $details->detail_specifier;
            $skuItem["details"][] = $detailsItem; 
        }

        $skuItem["prices"] = get_object_vars($sku->prices);


        $itemCode = $sku->sku_info->item->item_code;
        $categoryItem[$itemCode] = $skuItem; 
    }
    $allCategoryResult[] = $categoryItem; 
}


$name = 'Test Export';

$build = Excel::create($name, function ($excel) use ($allCategoryResult) {

    $excel->setTitle('Test Export');

    $excel->sheet('Test Export', function ($sheet) use ($allCategoryResult) {

        $sheet->fromArray($allCategoryResult);
})->download('xlsx');

1 Ответ

0 голосов
/ 18 января 2019

Метод fromArray() ожидает двумерный массив

$data=(
  array(2) (
    [0] => array(3) (
      [0] => 19738  
      [1] => ...
      [2] => ...
    )
    [1] => array(4) (
      [0] => 19739
      [1] => ...
      [2] => ...
      [3] => ...

Каждый элемент массива $ data является строкой. Каждый подэлемент является значением столбца. Перестройте создание своего массива, чтобы соответствовать этой структуре, и вы будете в бизнесе.

Этот код не проверен, просто пытаюсь привести пример. Я не уверен, что вы делаете с get_object_vars($sku->prices);. Я уверен, что это должно измениться.

$excelRows = [];

foreach($prices->categories as $category){ 

    $excelRows[] = [
      $category->category_code,
      $category->category_name,
      $category->category_desc
    ]

    foreach($category->skus as $sku){

        $row = [
          $sku->sku_info->identifier,
          $sku->sku_info->item->description,
          $sku->sku_info->item->item_type->count
        ]

        foreach ($sku->sku_info->details as $details) {
          $row[] = $details->detail_code;
          $row[] = $details->detail_code2;
          $row[] = $details->detail_specifier; 
        }

        $row[] = get_object_vars($sku->prices);

        $row[] = $sku->sku_info->item->item_code;

        $excelRows[] = $row;
    }
}
...