Разобрать электронную таблицу в массиве PHP и вернуть вложенную MLM-подобную таблицу с родительскими дочерними отношениями. - PullRequest
0 голосов
/ 06 сентября 2018

В настоящее время я работаю над проектом, который требует, чтобы я взял загруженный файл электронной таблицы (XLSX, XLS и т. Д.), Поместил его в массив, затем на основе родительских и дочерних отношений построил таблицу HTML, структурированную для отображения Настройка рефералов MLM.

Например:

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

(Извините за слабое структурирование, чтобы объяснить это)

Я хочу показать, кто бы ни был чьим-то ребенком, его информация помещена в таблицу относительно родителя.

Я пытался использовать PhpSpreadsheet, но безрезультатно. Я не использую базу данных, поскольку это будет простая загрузка вашей электронной таблицы и отображение ее в таблице с соответствующими отношениями, сгруппированными вместе.

Любая помощь будет принята с благодарностью, так как это первый пост для меня, а также первый проект MLM tree / excel!

<code><?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 '
'; // $ output = fopen ('test.xlsx', 'w'); // foreach ($ рядов как $ файл) { // $ result = []; // array_walk_recursive ($ file, use ($ item) use (& $ result) { // $ result [] = $ item; //}); //} // $ writer = \ PhpOffice \ PhpSpreadsheet \ IOFactory :: createWriter ($ result, "Xlsx"); // $ writer-> save ("05featuredemo.xlsx"); function buildTree (массив $ elements, $ parentId = 0) { $ branch = array (); foreach ($ elements как $ element) { if ($ element [0] == $ parentId) { $ children = buildTree ($ elements, $ element [0]); if ($ children) { $ element [1] = $ children; } $ branch [] = $ element; } } возврат $ ветка; } $ tree = buildTree ($ row); } ?> <! DOCTYPE html> Заголовок страницы

Это то, с чем я работал. Я узнал, как красиво поместить его в массив, но я не могу преобразовать его в линейное древовидное представление:

Parent
    Child
        Child
            Child
        Child
    Child
        Child

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

1 Ответ

0 голосов
/ 08 сентября 2018

Вот некоторый non_recursive код, который поможет вам начать работу (если вы еще не решили его), который создаст дерево на основе массива $rows, загруженного из электронной таблицы.

Идея состоит в том, что у каждого узла есть имя и массив дочерних элементов. . Таким образом, код просто создает узел для каждого человека (родитель и потомок) на шаг 1 , а затем заполняет ссылки на шаг 2 , работая снизу вверх.

Код не устойчивый и, вероятно, даст нежелательные результаты, если строки $rows были бы повторены, находились не в правильном порядке в списке или указывали дочерний элемент и родительский элемент в неправильном месте. ! Хороший производственный код должен позаботиться об этих возможностях, возможно, путем проверки и исправления $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
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)
...