将电子表格解析为 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 & 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
(
)
)
)
)
)
)
)
)
)
我目前正在开展一个项目,该项目要求我获取上传的电子表格文件(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 & 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
(
)
)
)
)
)
)
)
)
)