将二维数组转换为多维

问题描述 投票:0回答:2

我如何将这个二维数组转换为树,即

这个

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => User
            [parent_id] => 0
        )

    [1] => Array
        (
            [id] => 2
            [name] => Product
            [parent_id] => 0
        )

    [2] => Array
        (
            [id] => 3
            [name] => Login
            [parent_id] => 1

        )

    [3] => Array
        (
            [id] => 4
            [name] => Forgot Password
            [parent_id] => 3

        )
}

Array
(

    [1] => User => Array
    (
        [3] => Login => Array
        (
            [4] => Forgot Password
        )
    }
    [2] => Product
}

即根据父代 ID 创建子代

php arrays multidimensional-array
2个回答
0
投票

代码:

/**
 * Convert tree array to custom tree
 * 
 * @param array $array given array
 * @param string $child_key child key name
 * @param type $id_key id key name
 * @param type $value_key value key name
 * @return array converted array
 */        
function toCustomSets(array $array, $child_key = 'items', $id_key = 'id', $value_key = 'name')
{
    $return = array();

    foreach ($array as $element) {
        if (count($element[$child_key])) {
            $return[$element[$value_key]] = array();
            $return[$element[$value_key]][$element[$id_key]] = $element[$value_key];
            $return[$element[$value_key]] = ($return[$element[$value_key]] + toCustomSets($element[$child_key]));
        } else {
            $return[$element[$id_key]] = $element[$value_key];
        }
    }

    return $return;
}
/**
 * Convert array to tree
 * 
 * @param array $array given array
 * @param int $parent_id parent id
 * @param string $parent_key parent id key name
 * @param string $id_key id key name
 * @return array converted array 
 */
function toTree(array $array, $parent_id = 0, $parent_key = 'parent_id', $id_key = 'id')
{
    $return = array();

    foreach ($array as $element) {
        if ($element[$parent_key] == $parent_id) {
            $element['items'] = toTree($array, $element[$id_key]);
            $return[] = $element;
        }    
    }

    return $return;
}

用途:

$data = array(
    array('id' => 1, 'name' => 'User', 'parent_id' => 0),
    array('id' => 2, 'name' => 'Product', 'parent_id' => 0),
    array('id' => 3, 'name' => 'Login', 'parent_id' => 1),
    array('id' => 4, 'name' => 'Forgot Password','parent_id' => 3));

$tree = toTree($data);
print_r(toCustomSets($tree));

输出:

Array
(
    [User] => Array
        (
            [1] => User
            [Login] => Array
                (
                    [3] => Login
                    [4] => Forgot Password
                )

        )

    [2] => Product
)

0
投票

现场演示

要将给定的二维数组转换为多维数组,您可以使用

recursive
函数来构建层次结构

convert_hierarchy()
函数是一个递归函数,它将输入数组和父ID作为参数。函数调用自身来查找其子级,并创建一个嵌套数组,以子级 ID 为键,以子级名称为值

如果没有子项,它只是将子项名称分配给父项 ID

top-level
使用默认父 ID 0 调用 Convert_hierarchy 来启动该进程。

$inputArray = array(
    array('id' => 1, 'name' => 'User', 'parent_id' => 0),
    array('id' => 2, 'name' => 'Product', 'parent_id' => 0),
    array('id' => 3, 'name' => 'Login', 'parent_id' => 1),
    array('id' => 4, 'name' => 'Forgot Password', 'parent_id' => 3)
);

function convert_hierarchy($array, $parentId = 0)
{
    $result = array();

    foreach ($array as $item) {
        if ($item['parent_id'] == $parentId) {
            $children = convert_hierarchy($array, $item['id']);
            if (!empty($children)) {
                $result[$item['id']][$item['name']] = $children;
            } else {
                $result[$item['id']] = $item['name'];
            }
        }
    }

    return $result;
}

$outputArray = convert_hierarchy($inputArray);
// Print the output array
echo '<pre>'; print_r($outputArray); echo '</pre>';
© www.soinside.com 2019 - 2024. All rights reserved.