【问题标题】:Read CSV file and create dynamic PHP array having parent-child relationship读取 CSV 文件并创建具有父子关系的动态 PHP 数组
【发布时间】:2017-04-13 04:48:55
【问题描述】:

我有以下格式的 csv 文件:

 Field1, Field2, Field3, Field4, Field5

 Live Animals,  LIVE ANIMALS, INDIA,Value,Thousands

 Live Animals,  LIVE ANIMALS, LEBANON,Value,Millions

 Live Animals,  MEAT,INDIA,Value,Thousands

 Live Animals,  MEAT,INDIA,Value,Millions   

 Live Animals,  FISH,INDIA,Value,Thousands  

 Live Animals,  CRUSTACEANS, LEBANON,Value,Millions 

 Live Animals,  DAIRY PRODUCE , INDIA,Value,Thousands   

 Live Animals,  DAIRY PRODUCE , LEBANON,Value,Millions  

 Live Animals,  PRODUCTS OF ANIMAL ORIGIN,INDONESIA,Value,Thousands 

 Live Animals,  PRODUCTS OF ANIMAL ORIGIN,INDONESIA,Value,Millions

 Plant Products, LIVE TREES AND PLANTS,INDONESIA,Value,Thousands    

 Plant Products, LIVE TREES AND PLANTS,INDONESIA,Value,Millions 

 Plant Products, EDIBLE VEGETABLES,USA,Value,Thousands  

 Plant Products, EDIBLE VEGETABLES,USA,Value,Millions   

 Plant Products, EDIBLE FRUIT,UAE,Value,Thousands

 Plant Products, EDIBLE FRUIT,UAE,Value,Millions    

 Plant Products, COFFEE,BAHRAIN,Value,Thousands

 Plant Products, CEREALS,BAHRAIN,Value,Thousands

预期输出数组

Array
(
    [Live Animals] => Array
        (
            [LIVEANIMALS] => Array
                (
                    [INDIA] => Array
                        (
                            [Value] => Array
                                (
                                    [0] => Thousands
                                    [1] => Millions
                                )
                        )
                    [LEBANON] => Array
                        (
                            [Value] => Array
                                (
                                    [0] => Thousands
                                    [1] => Millions
                                )
                        )
                )

            [MEAT] => Array
                (
                    [INDIA] => Array
                        (
                            [Value] => Array
                                (
                                    [0] => Thousands
                                    [1] => Millions
                                )
                        )
                )

            [FISH] => Array
                (
                    [INDIA] => Array
                        (
                            [Value] => Array
                                (
                                    [0] => Thousands
                                )
                        )
                )
        )
    .... and so on. 
)

我想创建一个多维数组,其中一个级别可以是另一个级别的子级,类似于树层次结构。 CSV 文件可以有任意数量的列,因此我需要一些动态的方法来创建一个父子关系数组。

到目前为止,我尝试了许多不同的方法,但没有一个对我有用,因为我必须对每个 CSV $row 索引进行硬编码才能获得 CSV $row 项目。

请帮助,任何帮助将不胜感激,

【问题讨论】:

    标签: php arrays csv tree hierarchy


    【解决方案1】:

    如果我理解正确,最后两项始终是值。其余的是键,但键的数量可能不同。

    所以我们可以提取值(即最后两项),其余的将是数组键。然后我们可以遍历所有的键,或者在这个例子中我选择简单地将它们内爆到一个字符串:

    <?php
    foreach ( $row as $rowArr ) {
        $values = array_slice( $rowArr, - 2 );
        $keys   = array_slice( $rowArr, 0, - 2 );
    
        $keysString = "['" . implode( "'], ['", $keys ) . "']";
    
        $result{$keysString} = $values;
    }
    

    编辑

    重读您的问题后,我认为只有最后一项才是价值。我对 value 字段有点困惑。

    如果您只想要最后一个值,您不妨这样做:

    $value = array_pop($rowArr);
    $keys = $rowArr;
    

    所以现在我们有一个键数组:$rowArr。如果您不想使用我在示例中提供的implode()Google is your friend

    【讨论】:

    • 是的,只有最后一项是值。另外,我尝试了您上面的代码。它在某种程度上有所帮助,但是我如何使用数组键而不是上面代码中的字符串来创建?我是否需要在循环内运行循环才能到达最后一级?你能帮忙吗?
    • 从您的代码中,我想实现这样的目标。 $result[$keys[0]][$keys[1] ][$keys[2] ][$keys[3] ] = $values;但以动态方式而不是 $keys[0], $keys[1] ..... 这将以我需要的格式打印一个数组。有任何想法吗? :-)
    • 是的。我已经编辑了我的答案并引用了一个答案,他们在其中循环键。
    • 谢谢,只需要很少的改动,我就能达到我想要的结果。但是,您的回答让我走上了正确的道路。
    猜你喜欢
    • 2012-03-16
    • 2011-10-21
    • 2014-01-11
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多