preg_split строка в многомерный массив - PullRequest
1 голос
/ 04 октября 2011

Здравствуйте, просто ищу помощи, потому что я застрял

У меня есть две строки:

C:\Users\Bob\My Documents
/Users/Bob/Documents

Это проходит через

preg_split('/(?<=[\/\\\])(?![\/\\\])/', $string)

, который возвращает

Array
(
    [0] => C:\
    [1] => Users\
    [2] => Bob\
    [3] => My Documents
)

Array
(
    [0] => /
    [1] => Users/
    [2] => Bob/
    [3] => Documents
)

Мне нужно

Array
(
    [C:\] => Array
        (
            [Users] => Array
                (
                    [Bob] => Array
                        (
                            [My Documents] => array()
                        )

                )

        )

)

Array
(
    [/] => Array
        (
            [Users] => Array
                (
                    [Bob] => Array
                        (
                            [Documents] => array()
                        )

                )

        )

)

И в конечном итоге слился с

Array
(
    [C:\] => Array
        (
            [Users] => Array
                (
                    [Bob] => Array
                        (
                            [My Documents] => array()
                        )

                )

        )
    [/] => Array
        (
            [Users] => Array
                (
                    [Bob] => Array
                        (
                            [Documents] => array()
                        )

                )

        )

)

(правильно объединено, а не просто добавлено, поэтому, если другая строка начинается с C:\Users\Dan, тогда в «3-м» измерении появится дан.

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Просто возьмите массивы, возвращенные preg_split(), и постройте из них структуру дерева:

$tree = array();
foreach ( $strings as $string ) {
    $path = preg_split( '/(?<=[\/\\\])(?![\/\\\])/', $string );
    $ptr =& $tree;
    foreach ( $path as $elem ) {
        if ( ! array_key_exists( $elem, $ptr ) )
            $ptr[ $elem ] = array();
        $ptr =& $ptr[ $elem ];
    }
}
0 голосов
/ 04 октября 2011

Возможно, вам лучше всего использовать pathinfo ()

http://uk.php.net/manual/en/function.pathinfo.php

и realpath () http://uk.php.net/manual/en/function.realpath.php

Я предполагаю, что вы пытаетесь отобразитькаталог * nix для Windows?

...