1

这是我从 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 (parent)。如果父项 == 0,则它没有父项并且是级别 0。级别 0 的任何子项都是级别 1,依此类推。

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

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

那么使用 PHP 如何实现我所追求的呢?

4

3 回答 3

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 );
于 2012-06-18T18:11:02.087 回答
1

快速地把它搅在一起,有点脏,但我认为这是你需要的。

http://snipt.org/vagU0

于 2012-06-18T18:13:24.443 回答
0

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

于 2012-06-18T17:43:46.347 回答