4

多次元配列に入れたいこの文字列があるとしましょう。

編集:文字列内のサブフォルダーの数は動的です..ゼロサブフォルダーから10まで

<?php
       $string ="Folder1/Folder2/Folder3/filename1\n";
       $string .=" Folder1/Folder2/Folder3/filename2\n";
       $string .=" Folder4/Folder2/Folder3/filename3\n";
?>

次の配列を返したい

<?php
 Array
(
    [Folder1] => Array
        (
            [Folder2] => Array
                (
                    [Folder3] => Array
                        (
                            [0] => filename1
                            [1] => filename2
                        )

                )

        )

    [Folder4] => Array
        (
            [Folder2] => Array
                (
                    [Folder3] => Array
                        (
                            [0] => filename3
                        )

                )

        )

)
?>

これを達成するための最も効率的な方法は何ですか?

面白いことに、この配列が地球の反対側に送信され、文字列に戻りたいとしましょう。どうすればそれができますか?

4

3 に答える 3

10

からコードを借りることができますこのクラス (リンクは利用できなくなりました)、具体的には_processContentEntry方法。

ジョブを実行するメソッドの修正版を次に示します。

function stringToArray($path)
{
    $separator = '/';
    $pos = strpos($path, $separator);

    if ($pos === false) {
        return array($path);
    }

    $key = substr($path, 0, $pos);
    $path = substr($path, $pos + 1);

    $result = array(
        $key => stringToArray($path),
    );

    return $result;
}

の出力

var_dump(stringToArray('a/b/c/d'));

なる

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        [0]=>
        string(1) "d"
      }
    }
  }
}

それがあなたが必要としているものだと思います:)


アップデート

あなたのコメントによると、改行文字で区切られた文字列を処理する方法は次のとおりです。

$string = "Folder1/Folder2/Folder3/filename1\n";
$string .= " Folder1/Folder2/Folder3/filename2\n";
$string .= " Folder4/Folder2/Folder3/filename3\n";

// split string into lines
$lines = explode(PHP_EOL, $string);

// trim all entries
$lines = array_map('trim', $lines);

// remove all empty entries
$lines = array_filter($lines);

$output = array();

// process each path
foreach ($lines as $line) {
    // split each line by /
    $struct = stringToArray($line);

    // merge new path into the output array
    $output = array_merge_recursive($output, $struct);
}

print_r($output);

PSこの配列を文字列に変換するには、json_encodeを呼び出すだけですが、配列に変換してから元に戻す理由はありません。

于 2012-04-12T12:39:02.700 に答える
-1

私はこれがあなたが望むものだと思います、

$string ="Folder1/Folder2/Folder3/filename1\n";
$string .="Folder1/Folder2/Folder3/filename2\n";
$string .="Folder4/Folder2/Folder3/filename3\n";


$string_array_1 = explode("\n", $string);

$array_need = array();

foreach($string_array_1 as $array_values)
{
        if($array_values)
        {
            $folders =  explode("/", $array_values);
            $array_need[$folders[0]][$folders[1]][$folders[2]][] = $folders[3];
        }
    }

print_r($array_need);
于 2012-04-12T12:54:48.560 に答える