Let\'s say I have this string which I want to put in a multidimensional array.
Edit : The number of subfolders in the string are dynamic .. from zero sub folders to
This can be solved recursively in another way by taking the items from the beginning of the array and when the last item is reached just return it.
function make_tree( $arr ){
if( count($arr) === 1){
return array_pop( $arr );
}else{
$result[ array_shift( $arr )] = make_tree( $arr ) ;
}
return $result;
}
$string = "Folder1/Folder2/Folder3/filename1\n";
$string .= "Folder1/Folder2/Folder3/filename2\n";
$string .= "Folder4/Folder2/Folder3/filename3\n";
$string = trim( $string );
$files_paths = explode( PHP_EOL, $string);
$result = [];
foreach ($files_paths as $key => $value) {
$parted = explode( '/', $value );
$tree = make_tree( $parted );
$result = array_merge_recursive( $result, $tree );
}
var_dump( $result );
You could borrow pieces of code from this class (link no longer available), specifically the _processContentEntry
method.
Here's a modified version of the method that does the job:
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;
}
The output of
var_dump(stringToArray('a/b/c/d'));
Will be
array(1) {
["a"]=>
array(1) {
["b"]=>
array(1) {
["c"]=>
array(1) {
[0]=>
string(1) "d"
}
}
}
}
I suppose that's what you need :)
UPDATE
As per your comment, here's how you can process a string separated by new line characters:
$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);
P.S. To convert this array to a string, just call json_encode, however I see no reason to convert it to an array and then back to what it was.
I think this what you want,
$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);