0

I have a weird question to ask, and i'm having difficulty wrapping my head around it. But basically I have this json string:

{
  "001-file":{
    "filename":"001 - file",
    "slugify":"001-file",
    "size":{
      "mb":60.4,
      "text":"60.4 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder3/"
  },
  "002-file":{
    "filename":"002 - file",
    "slugify":"002-file",
    "size":{
      "mb":60.2,
      "text":"60.2 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder3/"
  },
  "003-file":{
    "filename":"003 - file",
    "slugify":"003-file",
    "size":{
      "mb":60.2,
      "text":"60.2 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder3/"
  },
  "004-file":{
    "filename":"004 - file",
    "slugify":"004-file",
    "size":{
      "mb":60.2,
      "text":"60.2 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder3/"
  },
  "005-file":{
    "filename":"005 - file",
    "slugify":"005-file",
    "size":{
      "mb":60.3,
      "text":"60.3 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder4/"
  },
  "006-file":{
    "filename":"006 - file",
    "slugify":"006-file",
    "size":{
      "mb":60.2,
      "text":"60.2 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder4/"
  },
  "007-file":{
    "filename":"007 - file",
    "slugify":"007-file",
    "size":{
      "mb":60.2,
      "text":"60.2 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder4/"
  },
  "008-file":{
    "filename":"008 - file",
    "slugify":"008-file",
    "size":{
      "mb":60.3,
      "text":"60.3 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder4/"
  },
  "009-file":{
    "filename":"009 - file",
    "slugify":"009-file",
    "size":{
      "mb":60.1,
      "text":"60.1 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder4/"
  },
  "010-file":{
    "filename":"010 - file",
    "slugify":"010-file",
    "size":{
      "mb":60.1,
      "text":"60.1 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder4/"
  },
  "011-file":{
    "filename":"011 - file",
    "slugify":"011-file",
    "size":{
      "mb":60.1,
      "text":"60.1 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder5/"
  },
  "012-file":{
    "filename":"012 - file",
    "slugify":"012-file",
    "size":{
      "mb":60.2,
      "text":"60.2 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder5/"
  },
  "013-file":{
    "filename":"013 - file",
    "slugify":"013-file",
    "size":{
      "mb":60,
      "text":"60.0 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder5/"
  },
  "014-file":{
    "filename":"014 - file",
    "slugify":"014-file",
    "size":{
      "mb":59.7,
      "text":"59.7 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder5/"
  },
  "015-file":{
    "filename":"015 - file",
    "slugify":"015-file",
    "size":{
      "mb":59.9,
      "text":"59.9 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder5/"
  },
  "016-file":{
    "filename":"016 - file",
    "slugify":"016-file",
    "size":{
      "mb":56.5,
      "text":"56.5 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder5/"
  },
  "017-file":{
    "filename":"017 - file",
    "slugify":"017-file",
    "size":{
      "mb":56.3,
      "text":"56.3 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder5/"
  },
  "018-file":{
    "filename":"018 - file",
    "slugify":"018-file",
    "size":{
      "mb":56.4,
      "text":"56.4 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder6/"
  },
  "019-file":{
    "filename":"019 - file",
    "slugify":"019-file",
    "size":{
      "mb":56.5,
      "text":"56.5 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder6/"
  },
  "020-file":{
    "filename":"020 - file",
    "slugify":"020-file",
    "size":{
      "mb":56.5,
      "text":"56.5 MB"
    },
    "directory":"file:///E:/Folder1/Folder2/Folder6/"
  }
}

And I need to group it based on the directory. Group all E: then group all Folder1 then Folder2 then Folder3 or Folder4 or Folder5

Here is an example of what I'm expecting to get:

{
  "E:":{
    "Folder1":{
      "Folder2":{
        "Folder3":{
          "001-file":{
            "filename":"001 - file",
            "slugify":"001-file",
            "size":{
              "mb":60.4,
              "text":"60.4 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder3/"
          },
          "002-file":{
            "filename":"002 - file",
            "slugify":"002-file",
            "size":{
              "mb":60.2,
              "text":"60.2 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder3/"
          },
          "003-file":{
            "filename":"003 - file",
            "slugify":"003-file",
            "size":{
              "mb":60.2,
              "text":"60.2 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder3/"
          },
          "004-file":{
            "filename":"004 - file",
            "slugify":"004-file",
            "size":{
              "mb":60.2,
              "text":"60.2 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder3/"
          }
        },
        "Folder4":{
          "005-file":{
            "filename":"005 - file",
            "slugify":"005-file",
            "size":{
              "mb":60.3,
              "text":"60.3 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder4/"
          },
          "006-file":{
            "filename":"006 - file",
            "slugify":"006-file",
            "size":{
              "mb":60.2,
              "text":"60.2 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder4/"
          },
          "007-file":{
            "filename":"007 - file",
            "slugify":"007-file",
            "size":{
              "mb":60.2,
              "text":"60.2 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder4/"
          },
          "008-file":{
            "filename":"008 - file",
            "slugify":"008-file",
            "size":{
              "mb":60.3,
              "text":"60.3 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder4/"
          },
          "009-file":{
            "filename":"009 - file",
            "slugify":"009-file",
            "size":{
              "mb":60.1,
              "text":"60.1 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder4/"
          },
          "010-file":{
            "filename":"010 - file",
            "slugify":"010-file",
            "size":{
              "mb":60.1,
              "text":"60.1 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder4/"
          }
        },
        "Folder5":{
          "011-file":{
            "filename":"011 - file",
            "slugify":"011-file",
            "size":{
              "mb":60.1,
              "text":"60.1 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder5/"
          },
          "012-file":{
            "filename":"012 - file",
            "slugify":"012-file",
            "size":{
              "mb":60.2,
              "text":"60.2 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder5/"
          },
          "013-file":{
            "filename":"013 - file",
            "slugify":"013-file",
            "size":{
              "mb":60,
              "text":"60.0 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder5/"
          },
          "014-file":{
            "filename":"014 - file",
            "slugify":"014-file",
            "size":{
              "mb":59.7,
              "text":"59.7 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder5/"
          },
          "015-file":{
            "filename":"015 - file",
            "slugify":"015-file",
            "size":{
              "mb":59.9,
              "text":"59.9 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder5/"
          },
          "016-file":{
            "filename":"016 - file",
            "slugify":"016-file",
            "size":{
              "mb":56.5,
              "text":"56.5 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder5/"
          },
          "017-file":{
            "filename":"017 - file",
            "slugify":"017-file",
            "size":{
              "mb":56.3,
              "text":"56.3 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder5/"
          }
        },
        "Folder6":{
          "018-file":{
            "filename":"018 - file",
            "slugify":"018-file",
            "size":{
              "mb":56.4,
              "text":"56.4 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder6/"
          },
          "019-file":{
            "filename":"019 - file",
            "slugify":"019-file",
            "size":{
              "mb":56.5,
              "text":"56.5 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder6/"
          },
          "020-file":{
            "filename":"020 - file",
            "slugify":"020-file",
            "size":{
              "mb":56.5,
              "text":"56.5 MB"
            },
            "directory":"file:///E:/Folder1/Folder2/Folder6/"
          }
        }
      }
    }
  }
}

Can someone point me in the direction I need to go in order to make this happen?

This is just an example, the real scenario can have different folder structures and about 1000 objects.

Thanks

4
  • Have you used json_decode to swap this to a php array? You could do whatever you need to there in php then use json_encode again once you've got the array where you need it. Commented Mar 4, 2014 at 21:46
  • Yeah, i've gone back and forth with json_encode and json_decode, But I don't know how to tackle the problem as an array either. Commented Mar 4, 2014 at 21:47
  • So what you're saying is you want to take each "file" and put it in folders that are dynamically created based on the file's directory string? Commented Mar 4, 2014 at 21:49
  • Exactly, feel free to edit my question if something doesn't make sense please. Commented Mar 4, 2014 at 21:51

1 Answer 1

1

I got you sorted out. You could probably find ways to refactor this to make it more efficient and suit your needs, but this does what you're looking for. Comments explain each code-block's purpose.

<?php

// new array
$new_array = array();


// orginal json string
$orig_json = '{"001-file":{"filename":"001 - file","slugify":"001-file","size":{"mb":60.4,"text":"60.4 MB"},"directory":"file:///E:/Folder1/Folder2/Folder3/"},"002-file":{"filename":"002 - file","slugify":"002-file","size":{"mb":60.2,"text":"60.2 MB"},"directory":"file:///E:/Folder1/Folder4/Folder5/"}}';

echo $orig_json.'<br/>';


// convert to array
$orig_array = json_decode($orig_json, true);
//view json as array
echo '<pre>';
print_r($orig_array);
echo '</pre>';


// loop through array
foreach( $orig_array as $file_key => $file ) {
   echo ('==========================================================================');
   // view current file array
   echo '<pre>';
   print_r($file);
   echo '</pre>';

   // convert directory string into array
   $directory_structure = explode('/',$file['directory']);
   echo '<pre>';
   print_r($directory_structure);
   echo '</pre>';

   // remove uncessary array items (file:, null entries)
   foreach( $directory_structure as $key => $d ) {
      if( $d == NULL || $d == 'file:') {
          unset($directory_structure[$key]);
      }
   }

   // view the pared down array
   echo '<pre>';
   print_r($directory_structure);
   echo '</pre>';

   // build directory based array structure
   $temp_array =& $new_array;
   foreach ($directory_structure as $d) {
     // check if key already exists
     if( !array_key_exists($d, $temp_array) ) {
        $temp_array[$d] = array();
     }
     // check if at end of directory structure (last "folder")
     if( end($directory_structure) == $d ) {
         $temp_array[$d][$file_key] = $file;
     }

     // append array
     $temp_array =& $temp_array[$d];
 } 

  echo "============================================================";
}

// view new directory array
echo '<pre>';
print_r($new_array);
echo '</pre>';

// json encode
$new_json = json_encode($new_array);

// view new json string
echo $new_json.'<br/>';
?>
Sign up to request clarification or add additional context in comments.

4 Comments

np. Basically you want to craft your php array so that you could get at file 001 by $new_array['E:']['Folder 1']['Folder 2']['Folder 3']['001-file']
I might need a little more guidance, this didn't do the trick. I even tried building from it, but I've reached no conclusion.
Ok, I'll flesh out a proof of concept when I have a moment.
I updated my answer to show you exactly what I was talking about. You can copypasta. It works out of the box and does what you're asking. Good luck.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.