我有一个csv文件,其中包含带有逗号分隔格式的类别树的字段,如下所示:

MotherCategory, ChildCategory1, ChildCategory2, ecc.


有些记录仅包含一个类别,另一些包含两个,其他包含三个或更多。

我希望能够在数据库中存储所有唯一类别,并使用parentid方案组织每条记录,其中parentid值是上一级类别的id

最后,我应该有以下内容:

id: 1, catname: MotherCategory, parentid: NULL
id: 2, catname: ChildCategory1, parentid: 1
id: 3, catname: ChildCategory2, parentid: 2


我已经过滤了数据,并使用array_unique()删除了重复项,接下来使用explode()能够分离值,并且我在对值进行计数并根据结果数组的长度分离组以构建树,但是我认为目前我缺少一些可以得到最终结果的东西。

我有以下代码。有人可以给我提示解决问题吗?

$cats = array_of_comma_separated_values;

foreach ($cats as $cat) {
    $catarray[] = explode(",",$cat);
}

//first level
$level1 = array_filter ($catarray, function($item) {
    if (count($item) == 1) { return true; } return false;
});

//second level
$level2 = array_filter ($catarray, function($item) {
    if (count($item) == 2) { return true; } return false;
});

$level3 = array_filter ($catarray, function($item) {
    if (count($item) == 3) { return true; } return false;
});

$level4 = array_filter ($catarray, function($item) {
    if (count($item) == 4) { return true; } return false;
});

$level5 = array_filter ($catarray, function($item) {
    if (count($item) == 5) { return true; } return false;
});

$level6 = array_filter ($catarray, function($item) {
    if (count($item) == 6) { return true; } return false;
});

$level7 = array_filter ($catarray, function($item) {
    if (count($item) == 7) { return true; } return false;
});


这给了我一些要迭代才能实现我要寻找的数组。

现在,由于Kovlar的建议,我正在基于array_pop()array_replace_recurive()进行开发。

我编辑了该帖子,因为可能我不太清楚。

最佳答案

我建议使用array_replace_recursive()来简化树合并:)



// $tree will contain the tree at the end of the script
$tree = [];
// we treat each row of the csv one by one
foreach($csv_rows as $row) {
    // first, we split the string into an array
    $root_to_leaf = explode(',', $row['root_to_leaf']);
    // this is the "leaf" we want to append to the tree
    $leaf = [array_pop($root_to_leaf) => $row['value']];
    // we rebuild the path from the leaf to the root
    while(!empty($root_to_leaf)) {
        // add the next branching toward the root
        $leaf = [array_pop($root_to_leaf) => $leaf];
    }
    // we append the leaf to the tree
    $tree = array_replace_recursive($tree, $leaf);
}

关于php - 在PHP的树中转换带有逗号分隔值的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37596339/

10-12 20:04