PHP - 将平面数据转换为分层多维数组

时间:2012-06-18 17:35:21

标签: php arrays multidimensional-array sorting

以下是我从CMS功能返回的数据:

array (
0 =>
stdClass::__set_state(array(
 'term_id' => '31',
 'parent' => '26'
)),
1 =>
stdClass::__set_state(array(
 'term_id' => '3',
 'parent' => '0'
)),
2 =>
stdClass::__set_state(array(
 'term_id' => '32',
 'parent' => '26'
)),
3 =>
stdClass::__set_state(array(
 'term_id' => '33',
 'parent' => '26'
)),
4 =>
stdClass::__set_state(array(
 'term_id' => '34',
 'parent' => '26'
)),
5 =>
stdClass::__set_state(array(
 'term_id' => '26',
 'parent' => '3'
)),

我需要将上面的内容转换为以下格式:

Array
(
[0] => Array
    (
        3
    )
[1] => Array
    (
        26
    )
[2] => Array
    (
        31
        32
        33
        34
    )
)

让我解释一下。源中的每个项目都是一个术语。每个字词都有一个ID (term_id)和一个父(parent)。如果父== 0,它没有父级并且是级别0.级别0的任何子项都是级别1,依此类推。

我想要返回的是一个数组,它包含该级别的所有级别及其ID。

请注意,这只是示例数据,每个级别上可能有更多级别和任意数量的ID。

所以使用PHP我如何实现我的目标?

3 个答案:

答案 0 :(得分:4)

假设有效的结构(没有孤儿等),可以循环数据并拔出每个下一级,直到不再有数据为止:

$output  = array();
$current = array( 0 );
$index   = 0;

while ( ! empty( $data ) ) {
    $parents        = $current;
    $current        = array();
    $output[$index] = array();

    foreach ( $data as $key => $term ) {
        if ( in_array( $term->parent, $parents ) ) {
            $output[$index][] = $term->term_id;
            $current[]        = $term->term_id;
            unset( $data[$key] );
        }
    }

    $index ++;
}

var_dump( $output );

答案 1 :(得分:1)

快速地将这个鞭打起来,有点脏,但我认为这就是你需要的。

http://snipt.org/vagU0

答案 2 :(得分:0)

我认为您需要更多数据。例如,父= 26的对象是2级。你现在怎么样?你需要有另一个数组,你将拥有parent_id及其级别。然后你可以遍历数组并构建你想要的东西。如果这是多维数组,您可以使用array_walk_recursive