将电子表格解析为 PHP 数组和 return 具有 parent child 关系的嵌套 MLM-like table

Parse spreadsheet into PHP array and return a nested MLM-like table with parent child relationships

我目前正在开展一个项目,该项目要求我获取上传的电子表格文件(XLSX、XLS 等),将其放入数组中,然后基于 parent child关系,构建一个 HTML table 结构来显示 MLM 推荐设置。

例如:

First Name | Last Name | Parent | Child
John        Johnson        0        1 
Mary        Sue            1        2 
Harold      Fineberg       1        3 
Gerald      George         2        4

(抱歉解释这个的蹩脚结构)

我想显示谁是某人的 child,他们的信息放在相对于 parent 的 table 中。

我曾尝试使用 PhpSpreadsheet 但无济于事。我没有使用数据库,因为这将是一个简单的上传电子表格并将其显示在 table 中,并将各自的关系组合在一起。

任何帮助将不胜感激,因为这对我来说是第一次 post,也是第一次传销 tree/excel 项目!

<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

if(isset($_POST['upload'])) {
    $filename = $_FILES['sheet']['tmp_name'];
    //$data = csv_to_array($filename);
    $spreadsheet = PhpOffice\PhpSpreadsheet\IOFactory::load($filename);
    $worksheet = $spreadsheet->getActiveSheet();
    $rows = [];
    foreach ($worksheet->getRowIterator() AS $row) {
        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(FALSE); // This loops through all cells,
        $cells = [];
        foreach ($cellIterator as $cell) {
            $cells[] = $cell->getValue();
        }
        $rows[] = $cells;
    }

    // echo '<pre>';
    // print_r($rows);
    // echo '</pre>';
    // $output = fopen('test.xlsx', 'w');
    // foreach ($rows as $file) {
    //     $result = [];
    //     array_walk_recursive($file, function($item) use (&$result) {
    //         $result[] = $item;
    //     });
    // }

    // $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($result, "Xlsx");
    // $writer->save("05featuredemo.xlsx");
    function buildTree(array $elements, $parentId = 0) {
        $branch = array();

        foreach ($elements as $element) {
            if ($element[0] == $parentId) {
                $children = buildTree($elements, $element[0]);
                if ($children) {
                    $element[1] = $children;
                }
                $branch[] = $element;
            }
        }

        return $branch;
    }

    $tree = buildTree($rows);
}
?>

  <!DOCTYPE html>
  <html>

  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>

  <body>
    <div class="form-container">
      <form enctype="multipart/form-data" method="POST">
        <div class="form-box">
          <input type="file" name="sheet" id="sheet" accept=".xls,.xlsx">
        </div>

        <div align="center">
          <input type="submit" name="upload" value="Upload &amp; Convert">
        </div>
      </form>
    </div>
  </body>

  </html>

这就是我一直在使用的东西。我已经找到如何将它很好地放入数组中,但我似乎无法将其转换为线性树视图:

Parent
    Child
        Child
            Child
        Child
    Child
        Child

评论的代码是我尝试过但由于可能有用而没有删除的东西。如果我不需要使用 PhpSpreadhseet 那就太好了,但我可以妥协。

这里有一些 non_recursive 代码可以帮助您入门(如果您还没有解决它),它将基于 $rows 构建树从电子表格加载的数组。

想法是每个节点都有一个name和一个array of children.。所以代码只是在step 1中为每个人(parent和children)创建一个节点,然后在step中填写链接2 自下而上工作。

该代码不可靠,如果重复 $rows 的行、在列表中的顺序不正确,或者可能会产生不需要的结果在错误的地方显示 child 和 parent!好的生产代码需要处理这些可能性,可能是在构建树之前检查和修复 $rows

$rows = [];
$rows[] = array(0,1);
$rows[] = array(1,2);
$rows[] = array(1,3);
$rows[] = array(1,4);
$rows[] = array(2,5);
$rows[] = array(3,6);
$rows[] = array(6,7);

// Build the required tree
$tree = makeTree($rows);
print_r($tree);

function makeTree(array $rows){
    //----------------------
    // Step 1. Make a list of nodes 
    // -----------------------
    // make the parent node
    $nodeList =[];
    $nodeList[0]['name'] = "parent:";
    $nodeList[0]['Children'] = [];

    // make the child nodes
    foreach ($rows as $cells) 
    {
         $nodeList[$cells[1]]['name'] = "child:".$cells[1];
         $nodeList[$cells[1]]['Children'] = [];
    }
    //----------------------
    // Step 2. link each child node to its parent node
    // -----------------------
    for ($n = count($rows)-1; $n>=0; $n--)
    {   // do this from the bottom up
        $nodeParent = &$nodeList[$rows[$n][0]];
        $nodeChild = &$nodeList[$rows[$n][1]];
        $nodeParent['Children'][$rows[$n][1]]= $nodeChild;  
    }

    // pick out the parent node (which by now should have all links in place)
    $tree[0] = $nodeList[0];
    return($tree);
}

输出如下,可能接近也可能不接近你的需要。

 Array
(
    [0] => Array
        (
            [name] => parent:
            [Children] => Array
                (
                    [1] => Array
                        (
                            [name] => child:1
                            [Children] => Array
                                (
                                    [4] => Array
                                        (
                                            [name] => child:4
                                            [Children] => Array
                                                (
                                                )

                                        )

                                    [3] => Array
                                        (
                                            [name] => child:3
                                            [Children] => Array
                                                (
                                                    [6] => Array
                                                        (
                                                            [name] => child:6
                                                            [Children] => Array
                                                                (
                                                                    [7] => Array
                                                                        (
                                                                            [name] => child:7
                                                                            [Children] => Array
                                                                                (
                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                    [2] => Array
                                        (
                                            [name] => child:2
                                            [Children] => Array
                                                (
                                                    [5] => Array
                                                        (
                                                            [name] => child:5
                                                            [Children] => Array
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)