Вопрос по arrays, php – Многомерный массив из строки

3

Допустим, у меня есть эта строка, которую я хочу поместить в многомерный массив.

Изменить: количество подпапок в строке является динамическим .. от нуля подпапок до 10

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

Я хочу вернуть следующий массив

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

                )

        )

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

                )

        )

)
?>
</code>

Что было бы наиболее эффективным способом сделать это?

И ради забавы, скажем, этот массив будет отправлен на другую сторону мира, и он хочет вернуться к строке. Как бы мы это сделали?

Потому что некоторые хотели бы вывести его как массив, а некоторые хотели бы сохранить его как строку в БД. Отправка и того, и другого будет возможна, но не очень эффективна. Paolo_Mulder
возможный дубликатString with array structure to Array Jon
Ну, если у вас есть строка, и вы в конечном итоге хотите строку, зачем вам массив? Madara Uchiha♦
@Paolo_Mulder Пожалуйста, опубликуйте желаемый результат, если у вас есть имя файла без пути в строке ввода. Это интересный вопрос, но я думаю, что вам нужно иметь всеобъемлющий родительский массив для хранения имен файлов без путей. Вот то, что я лачу:3v4l.org/UGK0l mickmackusa

Ваш Ответ

2   ответа
-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);
Это здорово, но не динамично. Что делать, если количество подпапок меняется? Папка5 / Папка2 / Папка3 / Папка4 / имя файла4 Paolo_Mulder
хорошо, тогда подождите, скоро обновлю вас.
9

этот классконкретно_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"
      }
    }
  }
}

Я полагаю, это то, что вам нужно :)

UPDATE

Согласно вашему комментарию, вот как вы можете обработать строку, разделенную символами новой строки:

$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);

Постскриптум Чтобы преобразовать этот массив в строку, просто вызовитеjson_encodeОднако я не вижу причин для преобразования его в массив, а затем вернуться к тому, что было.

Это вернет другой массив. Мой пример не содержит 3 строки, но 1 строка состоит из 3 строк. Попробуй сам. Но спасибо за указание в правильном направлении. Paolo_Mulder
Добавлен код для обработки ваших многострочных строк. Теперь он выводит тот же массив, что и вам.

Похожие вопросы