I am creating a questionnaire for a client that requires the questions to be organized by 3 layers of levels. I’ve successfully created the U.I. however I’ve been trying for the last 3 hours to pull data from a database in such a way that everything loads in the right place. The database is organized like so by the client so i have no control over it:
id description parentId about
1 Level 1 0 This is the top level or in my case tab1
2 Level 2 0 This is the next tab in the top level
3 Level 1a 1 This is the first category under tab1
4 Level 1b 1 This is the next category under tab1
5 Level 1a1 3 This is the content under the first category of tab1
So anything with a parentId of 0 is the top level and will contain anything of the second level with the parentId of 1 and so on. Confusing yes, I can barely make sense of this but this is how I’ve been told to do it.
What approach would be the best way to execute something like this? An example from another question I’m using as a reference is attached below (although not working)
foreach (mysql_query("SELECT * FROM pB_test ORDER BY id ASC") as $row) {
$menuitem = array_merge(array(), $row);
$menuLookup[$menuitem['id']] = $menuitem;
if ($menuitem['parent'] == null) {
$menuitem['path'] = "/" . $menuitem['name'];
$menu[] = $menuitem[];
} else {
$parent = $menuLookup[$menuitem['parent']];
$menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
$parent['menu'][] = $menuitem;
}
}
Any help would be greatly appreciated. Cheers
It might be worth doing this in PHP, as opposed to SQL if you’re working with an external database. I haven’t benchmarked the following, so try with your data and see if performance is problematic or not.
You can choose yourself what to do with orphaned records (which reference parentIDs that don’t exist anymore).
Ordering in PHP like this requires that you have all of your data beforehand, so use something like PDO’s
fetchAll(PDO::FETCH_ASSOC)method, which should result in something like this:First off, you’ll want to have the primary key (ID) as the array’s keys. The following also adds the keys “children” and “is_orphan” to every record.
This will look something like this:
Now, it gets tricky: we’ll loop through the array and add references.
The last step is to clean up the ‘root’ of the array. It’ll contain references to duplicate rows.
Use
print_r($data_by_id)after every step to see what happens.If this proves to be a time consuming operation, try to build up the tree by only doing
SELECT id, parentId FROM ...and then later fetching the metadata such asdescription. You could also store the result in Memcache or serialized into a database.