0

将其重写为更具体。

我有一个 csv 文件。每行都有一个字段,该字段分解为表示类别树的数组。因此,前三行可能会变成这样的数组:

array('food', 'fruit', 'red', 'apple')
array('food', 'fruit', 'green', 'kiwi')
array('beauty', 'makeup', 'lipstick')

不过,它应该是一棵树。我需要结束:

food
    fruit
        red
            apple
        green
            kiwi
beauty
    makeup
        lipstick

与这个问题和我见过的几十个类似问题的主要区别在于,每次读取的记录中没有保证的级别数,并且一个记录可能没有与另一个记录相同的键的明显可能性。所以 array_merge 似乎和使用 + 一样失败

唯一的保证是对于任何记录,假设键列表从数组的顶层开始,所以如果有

rec1 = animal, fish, shark
rec2 = fish, shark, hammerhead

预期的结果是

animal
    fish
        shark
fish
    shark
        hammerhead
4

2 回答 2

2
$i = count($array) - 1;
$new_array = $array[ $i ];

while ( $i-- ) {
    $new_array = array( $array[ $i ] => $new_array );
}

在此处查看实际操作:http ://codepad.viper-7.com/bVWYrN

于 2013-08-25T04:00:51.703 回答
0

这是一个可能的解决方案,使用递归。

<?php
$foo = array('food', 'fruit', 'red', 'apple');

function categorize($arr) {
        if (count($arr) > 2) {
                $temp[$arr[0]] = categorize(array_slice($arr, 1));
        } else {
                $temp[$arr[0]] = array($arr[1]);
        }   
        return $temp;

}
print_r(categorize($foo));

输出:

Array
(
    [food] => Array
        (
            [fruit] => Array
                (
                    [red] => Array
                        (
                            [0] => apple
                        )

                )

        )

)

链接更多示例: http ://codepad.org/xmK1oYy1

于 2013-08-25T06:08:09.637 回答