【问题标题】:get a category tree array from a csv file从 csv 文件中获取类别树数组
【发布时间】:2016-09-09 13:12:13
【问题描述】:

我有一个包含 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”,第三级是“level 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 并创建一个数组。但我关心的是“之后”创建结果数组。

这是我的“第一次尝试”

$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);

如果有人能告诉我我该往哪个方向走

谢谢

【问题讨论】:

  • I try several things, but a little bit "stuck". 然后显示一些代码,以便有人可以帮忙。
  • 你能给我们展示一个你想要的输出的例子吗?
  • 我用我想要的结果编辑我的第一个主题。谢谢

标签: php arrays sorting csv


【解决方案1】:

我现在很好(也许不是最好的方法,但它正在工作)

//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);

如果你有什么建议,我接受:)

谢谢

【讨论】:

    【解决方案2】:

    略有不同的方法:

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

    【讨论】:

    • 有没有办法获得第一个父母?我的意思是它只有类别的代码,但我想得到所有数组就像 ['parent_id' => 0, 'children' => array(...) ... ]
    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2013-04-16
    • 2014-09-12
    • 2019-05-23
    相关资源
    最近更新 更多