在没有完整路径的情况下向多维数组添加新维度

时间:2010-07-28 16:15:32

标签: php

如果我的头衔令人困惑,请道歉。我有一个类似的表,看起来像这样:

ID, Name,    Parent
1, Cat1,     0
2, Cat1_1,   1
3, Cat1_2,   1
4, Cat2,     0
5, Cat2_1,   4
6, Cat2_1_1, 5

我正在尝试将其转换为多维数组,以便类别树以正确的格式提供以用于显示目的等。

我正在编写一个递归函数(在类中),它将类别树的每个级别写入类变量。我的问题是,一旦我越过第二级,我就失去了引用类var的能力,以便创建当前类别的孩子。

我可以获得数组路径的字符串表示形式,但是有一种方法我可以评估它以便让我访问数组的正确级别...

通过示例:

$path_string = "[4]['children'][5]['children']";

是否有一些函数允许我说$ cat_path = $ cats。$ path_string以便$ cat_path指向数组的正确级别。

很抱歉,如果这一切听起来有点令人困惑。或者,如果有人知道更好的方法将数据(如上面的表示例中所示)转换为正确的多维数组,请告诉我!

由于

3 个答案:

答案 0 :(得分:0)

您可以创建一个可以为您下降路径的函数。例如:

function descend($array, $path) {
    foreach ($path as $pathMember) {
        if (!array_key_exists($array, $pathMember)) {
            return null;
        }

        $array = $array[$pathMember];

        if (!array_key_exists($array, 'children')) {
            // or throw
            return null;
        }

        $array = $array['children'];
    }

    return $array;
}

$descended = descend($categories, array(4, 5));

答案 1 :(得分:0)

假设一个平面数组(id,name,parent):

$treearray = array(0 => array('children'=>array()));
foreach($flatarray as $item){
    if(!isset($treearray[$item['id']])){
        $treearray[$item['id']] = array();
    }
    $treearray[$item['id']] = array_merge($item,$treearray[$item['id']]);
    if(!isset($treearray[$item['parent']]){
        $treearray[$item['parent']] = array('children'=>array());
    }
    $treearray[$item['parent']]['children'][$item['id']] = &$treearray[$item['id']];
}
print_r($treearray[0]);

或者,你也可以在一个项目中为它的父项创建一个引用,创建使用$treearray[$the_id_youre_interested_in]去任何一种方式的可能性。不要再尝试使用var_dump / print_r了但是,recursionfest deluxe。

答案 2 :(得分:-1)

尝试使用纯函数。

您的函数应该接受父ID并返回其子代数组,而不会更改任何对象的任何状态。

这会让人感到困惑。