Multidimensional array from string

前端 未结 3 675
故里飘歌
故里飘歌 2020-12-11 21:52

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

相关标签:
3条回答
  • 2020-12-11 22:19

    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 );
    
    0 讨论(0)
  • 2020-12-11 22:22

    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.

    0 讨论(0)
  • 2020-12-11 22:23

    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);
    
    0 讨论(0)
提交回复
热议问题