0

私のデータベースでのクエリの結果は、次のようなものを返します (各行のレコード):

1.
1.1.
1.1.01.
1.1.01.001
1.2.
1.2.01.
1.2.02.

次のように、多次元配列をツリー形式で返すものを作成しようとしています。

array(
    '1.' => array(
        '1.1' => array(
            '1.1.01.' => array(
                (int) 0 => '1.1.01.001'
            )
        ),
        '1.2' => array(
            (int) 0 => '1.2.01.',
            (int) 1 => '1.2.02.'
        )
    )
)

私ができることは、 を使用して要素の順序を逆にすることだけでしたexplode()

提案をいただければ幸いです。

4

1 に答える 1

2

あなたのフォーマットは次の理由で非常にトリッキーです:

1.2.
1.2.01.     |
1.2.02.     V  Making this array instead of value 

あなたが試すことができます

$string = "1.
1.1.
1.1.01.
1.1.01.001
1.2.
1.2.01.
1.2.02.";

$array = explode("\n", $string);
$data = array();
$temp = &$data;

$it = new CachingIterator(new ArrayIterator($array), CachingIterator::FULL_CACHE);
$continue = false;
foreach ( $it as $v ) {
    $v = trim($v);
    if ($it->hasNext()) {
        $next = trim($it->getInnerIterator()->current());
        if (stripos($next, $v) === 0) {
            $temp = &$temp[$v];
        } else {
            $temp[] = $v;
            if (strlen($next) != strlen($v)) {
                $temp = &$data;
            }
        }
    } else {
        $temp[] = $v;
    }
}
print_r($data);

出力

Array
(
    [1.] => Array
        (
            [1.1.] => Array
                (
                    [1.1.01.] => Array
                        (
                            [0] => 1.1.01.001
                        )

                )

        )

    [1.2.] => Array
        (
            [0] => 1.2.01.
            [1] => 1.2.02.
        )

)

これがmoveCOMPLEXデモです

于 2013-02-25T16:04:32.633 に答える