用于创建多维数组的算法

时间:2010-11-21 16:04:48

标签: php arrays algorithm sorting multidimensional-array

我正在使用PHP,我需要一个看似简单的数组任务的帮助。

这是我的示例数组:

$arr = array(
    0  => NULL,
    1  => NULL,
    2  => NULL,
    3  => NULL,
    8  => '2',
    9  => '2',
    10 => '2',
    11 => '2',
    12 => '3',
    13 => '3',
    14 => '8',
    15 => '8',
    16 => '14',
    17 => '14',
    18 => '14'
);

数组的键代表 ID (唯一) 值是 parentIDs ,即父“节点”的ID。 NULL表示没有parentID(即新数组的第一维)。

现在,我需要创建一个新的多维数组,其父元素下包含所有子元素。 (这可能听起来很混乱,抱歉我缺乏描述性能力。下面有一个例子,可以让事情更清楚)

以下是我的示例的新数组在“排序”功能之后的样子,或者你称之为的任何内容,应用了:

$arr = array(
 0 => array(),
 1 => array(),
 2 => array(
     8 => array(
        14 => array(
            16 => array(),
            17 => array(),
            18 => array()
),
        15 => array()
),
     9 => array(),
    10 => array(),
    11 => array()
),
 3 => array(
    12 => array(),
    13 => array()
)
);

我知道所有空数组()都可能不是一个非常干净和优雅的解决方案,但遗憾的是这就是我需要它的方式!

2 个答案:

答案 0 :(得分:2)

这个递归函数会将给定的数据添加到正确的父级,并且应该为起始数组中的每个元素调用一次。

function add_branch(&$tree, $datum, $parent) {

    // First we have the base cases:
    // If the parent is NULL then we don't need to look for the parent
    if ($parent == NULL) {
        $tree[$datum] = array();
        return true;
    }

    // If the array we've been given is empty, we return false, no parent found in this branch
    if (! count($tree)) {
        return false;
    }


    // We loop through each element at this level of the tree...
    foreach($tree as $key => $val) {

        // If we find the parent datum...
        if ($key == $parent) {

            // We add the new array in and we're done.
            $tree[$key][$datum] = array();
            return true;
        }

        // Otherwise, check all the child arrays
        else {

            // Now we check to see if the parent can be found in the curent branch
            // If a recursive call found a parent, we're done
            if (add_branch($tree[$key], $datum, $parent)) {
                return true;
            }
        }
    }

    // If none of the recursive calls found the parent, there's no match in this branch
    return false;

}

评论非常冗长,希望你能理解发生了什么。我鼓励你对递归函数进行一些阅读,以了解它。

这是如何使用的:

$arr = array(
 0 => NULL,
 1 => NULL,
 2 => NULL,
 3 => NULL,
 8 =>  '2',
 9 =>  '2',
10 =>  '2',
11 =>  '2',
12 =>  '3',
13 =>  '3',
14 =>  '8',
15 =>  '8',
16 => '14',
17 => '14',
18 => '14'
);


$final = array();

foreach ($arr as $datum => $parent) {
    add_branch($final, $datum, $parent);
}

$final现在有正确的整理数组,如问题中所示。

答案 1 :(得分:0)

两次传球都能解决问题。这将递归地将所有孩子与父母联系起来。

//$array is the input

//The tree starts out as a flat array of the nodes
$tree = array_combine(
    array_keys( $array ),
    array_fill( 0, count( $array ), array() )
);

//link children to parents (by reference)
foreach( $tree as $key => &$row ) {
    if( ! is_null( $array[$key] ) ) {
        $tree[ $array[$key] ][ $key ] =& $row;
    }
}

//remove non-root nodes
foreach( array_keys( $tree ) as $key ) {
    if( ! is_null( $array[$key] ) ) {
        unset( $tree[ $key ] );
    }
}