从csv文件中获取类别树数组

时间:2016-09-09 13:12:14

标签: php arrays sorting csv

我有一个包含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);

如果有人能告诉我我必须去哪个方向

谢谢

2 个答案:

答案 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。如果输入文件已经排序,那么按顺序执行它应该是完全可行的。