首页 > 解决方案 > 创建每个数组项的路径

问题描述

我已经构建了一个递归 PHP 函数来创建一个包含父/子的多维数组。现在我想创建一个函数来创建一个包含每个数组项路径的列表。请参阅以下数组:

$testdata = [
    ['id' => 1, 'parent_id' => null, 'desc' => 'Vehicles'],
    ['id' => 2, 'parent_id' => 1, 'desc' => 'Cars'],
    ['id' => 3, 'parent_id' => 1, 'desc' => 'Motorbikes'],
    ['id' => 4, 'parent_id' => 1, 'desc' => 'Planes'],
    ['id' => 5, 'parent_id' => 2, 'desc' => 'Toyota'],
    ['id' => 6, 'parent_id' => 2, 'desc' => 'Volkswagen'],
    ['id' => 7, 'parent_id' => 2, 'desc' => 'Renault'],
    ['id' => 8, 'parent_id' => 3, 'desc' => 'Honda'],
    ['id' => 9, 'parent_id' => 3, 'desc' => 'Yamaha'],
    ['id' => 10, 'parent_id' => 4, 'desc' => 'Boeing'],
    ['id' => 11, 'parent_id' => null, 'desc' => 'Cities'],
    ['id' => 12, 'parent_id' => 11, 'desc' => 'Amsterdam'],
    ['id' => 13, 'parent_id' => 11, 'desc' => 'New York'],
];

现在预期的结果应该是这样的:

$output = [
    'Vehicles'
    'Vehicles\Cars'
    'Vehicles\Cars\Toyota'
    'Vehicles\Cars\Volkswagen'
    'Vehicles\Cars\Renault'
    'Vehicles\Motorbikes'
    'Vehicles\Motorbikes\Honda'
    'Vehicles\Motorbikes\Yamaha'
    'Vehicles\Planes'
    'Vehicles\Planes\Boeing'
    'Cities'
    'Cities\Amsterdam'
    'Cities\New York'
];

我试图重建我的递归函数,但我无法绕过它。你们能给我一些建议或推动我朝着正确的方向前进吗?

标签: phprecursion

解决方案


这种方式通过构建输出和项目层次结构来解决问题。因此,每次获得新项目时,您都会构建一个表示“父文本”的字符串,并将当前项目添加到输出中。当稍后提到父级时 - 它可以只挑选出构建的文本表单$levels,而不必重新构建它......

$output = [];
$levels = [];
foreach ( $testdata as $entry ) {
    if ( $entry["parent_id"] == null )  {
        $text = $entry["desc"];
    }
    else    {
        $text = $levels[$entry["parent_id"]] . "/" . $entry["desc"]; 
    }
    $levels[$entry["id"]] = $text;
    $output [] = $text;
}
// Optionally sort output to group items
sort($output);
print_r($output);

排序会将项目组合在一起 - 否则它们将按照它们在输入数组中的顺序出现。

输出排序...

Array
(
    [0] => Cities
    [1] => Cities/Amsterdam
    [2] => Cities/New York
    [3] => Vehicles
    [4] => Vehicles/Cars
    [5] => Vehicles/Cars/Renault
    [6] => Vehicles/Cars/Toyota
    [7] => Vehicles/Cars/Volkswagen
    [8] => Vehicles/Motorbikes
    [9] => Vehicles/Motorbikes/Honda
    [10] => Vehicles/Motorbikes/Yamaha
    [11] => Vehicles/Planes
    [12] => Vehicles/Planes/Boeing
)

推荐阅读