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)ます。親 == 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

もっとデータが必要だと思います。たとえば、parent = 26 のオブジェクトはレベル 2 です。parent_id とそのレベルを持つ別の配列が必要です。次に、配列を反復処理して、必要なものを構築できます。これが多次元配列の場合、array_walk_recursive を使用できます

于 2012-06-18T17:43:46.347 に答える