从CSV文件获取类别树数组


get a category tree array from a csv file

我有一个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。如果输入文件是排序的,那么按顺序执行应该是完全可行的。