A common issue in lots of applications is tree sorting with unlimited depth. Phorum has used a recursive function since 1999 to solve this problem. However, at MySQL Conference this year, we finally wrote a non recursive function for it and acheived both memory and time savings on very large data sets. I always knew it could be done, I had just never stopped and worked it out. Most examples I found involved a left/right model that our data does not use. The left/right model involves altering rows when new rows are inserted into the tree. That is not attractive. Phorum uses just a parent_id field to track child members.

We would like to take this to another level and make a PHP internal funciton to do the work. In fact, since MySQL Conference, one of team members has written the function as a PHP extension. My questions is, if we made a generic tree sorting function, could this be a function that we could get considered for addition to the other array sorting functions. I have probably ported the Phorum PHP based for tree sorting over to 100 different other applications for sorting trees in PHP. It would be very nice to finally have an internal function for it.

Speed is not our main benefit, although there is a noticable speed boost. In addition to sorting the function, each node would be assigned a depth value (optionally named by a function parameter if needed). This is where the biggest memory savings have been found for us. On large data sets (2000 members) in PHP, we have found that altering the input array would cause copy of the whole array, blowing up the memory usage of the script to as much as 10x. Doing this in C helps to remove that problem.


Basically, an array would look like:

$array = array(
        1 => array(
                "id" => 1,
                "parent" => 0,
                "name" => "item 1"
        ),
        2 => array(
                "id" => 2,
                "parent" => 0,
                "name" => "item 2"
        ),
        3 =>array(
                "id" => 3,
                "parent" => 1,
                "name" => "item 1"
        ),
);

The function call would look like:

array_treesort($array, "id", "parent");

The returned array would look like:

$array = array(
        1 => array(
                "id" => 1,
                "parent" => 0,
                "name" => "item 1",
                "depth" => 0
        ),
        3 =>array(
                "id" => 3,
                "parent" => 1,
                "name" => "item 1",
                "depth" => 1
        ),
        2 => array(
                "id" => 2,
                "parent" => 0,
                "name" => "item 2",
                "depth" => 0
        ),
);


Its a little funky to have a function take names of fields like this, but this is the only way we could think of to make this work for people without them having to change their data structure.

You can see our current work at http://www.phorum.org/tracfcgi/browser/phorum5/trunk/extension_src That code has been written specifically for Phorum to replace our existing PHP function. It does more than the PHP internal function would do. But, the extra parts are not the things that we were trying to overcome. They are just gravy.

--

Brian Moon
Senior Developer
------------------------------
http://dealnews.com/
It's good to be cheap =)

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to