我有一个包含3个字段的csv:代码,父母,像这样的标签:
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"
我尝试制作像第一级一样的数组是" Cat A",第二级是" level1"第三级是"级别1 - 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并制作一个没有问题的数组。但我关注的是"""创建结果数组。
这是我的" fisrt尝试"
$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);
如果有人能告诉我我必须去哪个方向
谢谢
答案 0 :(得分:0)
我现在很好(也许不是最好的方式,但它有效)
//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);
如果你有一些建议我接受:)
谢谢
答案 1 :(得分:0)
略有不同的方法:
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。如果输入文件已经排序,那么按顺序执行它应该是完全可行的。