Предположим, у меня есть эта строка, которую я хочу разместить в многомерном массиве.
Изменить: количество подпапок в строке является динамическим .. от нулевых подпапок до 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 ) ) ) ) ?>
Каким будет самый эффективный способ достичь этого?
И для удовольствия от этого, скажем, этот массив будет отправлен на другую сторону мира, и он хочет вернуться к строке. Как мы это сделаем?
Вы могли бы заимствовать фрагменты кода из этого класса , в _processContentEntry
метод _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 , однако я не вижу причин для его преобразования в массив, а затем обратно к тому, что было.
Я думаю, это то, что вы хотите,
$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);