【问题标题】:generate categories tree with csv file使用 csv 文件生成类别树
【发布时间】:2011-09-21 10:15:23
【问题描述】:

我需要帮助才能从 CSV 文件生成类别树。

我尝试了很多东西,但我迷路了......

我有一个 800 行的文件,如下所示:

"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (500 HOUR)"
"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (1000 HOUR)"
"LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAIN FRAME", "OPERATOR CAB"

在这些方面, 第 1 列代表父类 第 2 列是第 1 列的子项 第 3 列是第 2 列的子项 第 3 列是第 4 列的母亲(但它是一个爆炸(',',第 3 列)) 在第 4 列爆炸的是 5 的母亲

我想生成一个这种类型的数组(并创建一个从 50 开始的 ID),因为目标是将此文件转换为 mysql DB:s

我会成功地拥有这样的东西

LOADERS (id = 50)
|___S130 (id = 51)
|----|____Above & 524611001 (id = 52)
|-----------|____ MAINTENANCE ITEMS (id = 53)
|------------------|____SCHEDULED MAINTENANCE ITEMS (500 HOUR) (id = 54)
|------------------|____SCHEDULED MAINTENANCE ITEMS (1000 HOUR) (id = 55)
|-----------|____ MAIN FRAME (id = 56)
|------------------|____OPERATOR CAB (id = 57)
|----|____Above & 524711001 (id = 58)
|-----------|____ MAINTENANCE ITEMS (id = 59)
|------------------|____SCHEDULED MAINTENANCE ITEMS (500 HOUR) (id = 60)
|------------------|____SCHEDULED MAINTENANCE ITEMS (1000 HOUR) (id = 61)
|-----------|____ MAIN FRAME (id = 62)
|------------------|____OPERATOR CAB (id = 63)

我尝试了一堆方法,我开始绝望。一切我什至没有达到预期的结果:我从星期一开始就汗流浃背,我想上吊。

【问题讨论】:

    标签: php arrays csv multidimensional-array tree


    【解决方案1】:

    试试这样的:

    <?php
    // generate categories tree with csv file
    // http://stackoverflow.com/questions/7498119/generate-categories-tree-with-csv-file
    
    $big_array  = array();
    $temp_array = array();
    
    $csv = <<< CSV
    "LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (500 HOUR)"
    "LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAINTENANCE ITEMS", "SCHEDULED MAINTENANCE ITEMS (1000 HOUR)"
    "LOADERS", "S130", "Above & 524611001, 524711001 & Above", "MAIN FRAME", "OPERATOR CAB"
    CSV;
    
    foreach(preg_split("/(\r?\n)/", $csv) as $line) {
    
        list($column1, $column2, $column3, $column4) = explode('", "', $line);
    
        $column1 = preg_replace('/^"/', '', $column1);
        $column4  = preg_replace('/\"(?<!\\")/', '', $column4);
    
        foreach(explode(', ', $column3) as $column3_part) {
            $temp_array[$column3_part][] = $column4;
        }
    
    
        $big_array[$column1][$column2] = $temp_array;
    }
    
    echo '<pre>' . print_r($big_array, 1) . '</pre><hr />';
    
    $counter = 50;
    foreach($big_array as $key1 => $level1) {
        foreach($level1 as $key2 => $level2) {
            foreach($level2 as $key3 => $level4) {
                foreach($level4 as $level5) {
    
                    echo '<pre>' . print_r('INSERT INTO DATABASE: ' . $counter . ', ' . $key1 . ', ' . $key2 . ', ' . $key3 . ', ' . $level5, 1) . '</pre>';
                    $counter++;
                }
            }
        }
    }
    ?>
    

    【讨论】:

    • 结果很有趣。但它缺少最后一个孩子。探索在“维护项目”和“主框架”上停止。它缺少一个级别(:s)但它是一个很棒的轨道。就我而言,我尝试使用此功能直接读取文件。我看到你用逗号替换了分号分隔,然后你把 CSV 放到了一个 var 中。无论如何,谢谢您的意见。
    • 我认为有一个错误,因为数组的一部分是完全空的:s
    • 我做了一个改变......它几乎可以工作。一些元素相乘。这是我的代码(抱歉格式化)。 $big_array = 数组(); $temp_array = 数组(); if (($handle = fopen("arbocsv.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { $连续剧 = preg_replace('/ /','',$data[2]); $serials = preg_replace('/&/',' & ',$serials); $serials = explode(',',$serials); foreach($serials as $serial) { $temp_array[$serial][$data[3]][] = $data[4]; } $big_array[$data[0]][$data[1]] = $temp_array; } } print_r($big_array);
    • 事实上,它工作得很好(添加了修改),只是我拥有的 CSV 文件被破坏了。我在 6 小时内发布了我的代码 =) 非常感谢
    【解决方案2】:

    再次非常感谢艾曼。这是我的代码,其中包含您给我的曲目。

    $big_array  = array();
    $temp_array = array();
    
    if (($handle = fopen("arbocsv.csv", "r")) !== FALSE) 
    {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
        {
    
            $serials = preg_replace('/ /','',$data[2]);
        $serials = preg_replace('/&/',' & ',$serials);
        $serials = explode(',',$serials);
    
        foreach($serials as $serial)
        {
            $temp_array[trim($serial)][trim($data[3])][] = trim($data[4]); 
        }
    
        $big_array[trim($data[0])][trim($data[1])] = $temp_array;
    
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多