我有一个csv,有三个字段Code, parent, label,像这样
code;parent;label
cata;;"Category A"
level1;cata;level1
level1_1;level1;"level 1 - 1"
level1_2;level1;"level 1 - 2"
level1_3;level1;"level 1 - 3"
level1_4;level1;"level 1 - 4"
level2;cata;level2
level2_1;level2;"level 2 - 1"
level2_2;level2;"level 2 - 2"
level2_3;level2;"level 2 - 3"
level2_4;level2;"level 2 - 4"
catb;;"Category B"
blevel1;catb;level1
blevel1_1;level1;"level 1 - 1"
blevel1_2;level1;"level 1 - 2"
blevel1_3;level1;"level 1 - 3"
blevel1_4;level1;"level 1 - 4"
blevel2;catb;level2
blevel2_1;level2;"level 2 - 1"
blevel2_2;level2;"level 2 - 2"
blevel2_3;level2;"level 2 - 3"
blevel2_4;level2;"level 2 - 4"
我试图使一个数组像第一级是"猫A",第二级是"level1"和第三级是"level1 - 1"与所有3个字段(代码,父,标签)在最后一级。
-cata
--level1
---level1_1
---level1_2
---level1_3
---level1_4
--level2
---level2_1
---level2_2
---level2_3
---level2_4
-catb
--blevel1
---blevel1_1
---blevel1_2
---blevel1_3
---blevel1_4
--blevel2
---blevel2_1
---blevel2_2
---blevel2_3
---blevel2_4
我尝试了一些东西,但有点"卡住"。我可以毫无问题地读取csv并创建数组。但是我关心的是"after"来创建结果数组。
这是我的"第一次尝试"
$file = 'imports/test-cat.csv';
$all_rows = array();
$header = null;
$f = fopen($file, "r");
$size = filesize($file) + 1;
while ($row = fgetcsv($f, $size, ";")) {
if ($header === null) {
$header = $row;
continue;
}
$all_rows[] = array_combine($header, $row);
}
fclose($f);
如果有人能告诉我该往哪个方向走
谢谢
我现在很好(也许不是最好的方式,但它正在工作)
//variables
$file = 'test.csv';
$all_rows = [];
$new = [];
$tofind = [];
$header = null;
//function
function createTree(&$list, $parent){
$tree = array();
foreach ($parent as $k=>$l){
if(isset($list[$l['code']])){
$l['children'] = createTree($list, $list[$l['code']]);
}
$tree[] = $l;
}
return $tree;
}
//parsing CSV
$f = fopen($file, "r");
$size = filesize($file) + 1;
while ($row = fgetcsv($f, $size, ";")) {
if ($header === null) {
$header = $row;
continue;
}
$all_rows[] = array_combine($header, $row);
}
foreach ($all_rows as $a){
$new[$a['parent']][] = $a;
}
//Get all root parent id
$keys = array_keys(array_column($all_rows, 'parent'), '');
foreach ($keys as $key){
$tofind[]= $all_rows[$key];
}
//Tree
$tree = createTree($new, $tofind);
如果你有什么建议,我就接受。
谢谢
稍微不同的方法:
function getTree($by_parent, $parent = '')
{
$ret = [];
foreach ($by_parent[$parent] as $row) {
if (isset($by_parent[$row['code']])) {
$ret[$row['code']] = getTree($by_parent, $row['code']);
} else {
$ret[$row['code']] = $row;
}
}
return $ret;
}
$file = 'imports/test-cat.csv';
$all_rows = array();
$header = null;
$f = fopen($file, "r");
$size = filesize($file) + 1;
while ($row = fgetcsv($f, $size, ";")) {
if ($header === null) {
$header = $row;
continue;
}
$all_rows[] = array_combine($header, $row);
}
$by_parent = [];
foreach ($all_rows as $row) {
$by_parent[$row['parent']][] = $row;
}
$tree = getTree($by_parent);
现在我想再做一次尝试,没有任何递归式或$by_parent。如果输入文件是排序的,那么按顺序执行应该是完全可行的。