Question

So I'm using the directory_map function in the Directory Helper and I'm wondering how I can edit that function (or maybe extend it or something) so that it sorts the multidimensional array it gives me.

Here is the array it currently produces;

 Array
 (
  [publications] => Array
    (
        [policy_documents] => Array
            (
               [_careers] => Array
                    (
                        [0] => careers.pdf
                    )
                [_background_quality_reports] => Array
                   (
                        [0] => industry.pdf
                        [1] => international.pdf
                        [2] => departmental_resources.pdf
                        [3] => contracts.pdf
                        [4] => research_and_development.pdf
                        [5] => trade.pdf
                    )
                [_pre_release_access_list] => Array
                    (
                        [0] => pre_release_access_list.pdf
                    )
            )
        [people] => Array
            (
                [health] => Array
                    (
                        [very_serious_injuries] => Array
                            (
                              [_1_january_2013] => Array
                                    (
                                        [0] => 1_january_2013.pdf
                                    )
                            )
                    )
                [military] => Array
                    (
                        [quarterly_manning_report] => Array
                            (
                                [_1_january_2013] => Array
                                   (
                                        [0] => 1_january_2013.pdf
                                    )
                            )
                        [monthly_manning_report] => Array
                            (
                               [_20110201_1_february_2011] => Array
                                    (
                                        [0] => 1_february_2011.xls
                                        [1] => key_points.html
                                        [2] => 1_february_2011.pdf
                                    )
                                [_20110301_1_march_2011] => Array
                                    (
                                        [0] => 1 March 2011.pdf
                                    )
                                [_20110501_1_may_2011] => Array
                                    (
                                        [0] => 1 May 2011.pdf
                                    )
                                [_20110401_1_april_2011] => Array
                                    (
                                        [0] => 1 April 2011.pdf
                                    )
                            )
                    )
                [civilian] => Array
                    (
                        [civilian_personnel_report] => Array
                            (
                                [_1_april_2012] => Array
                                    (
                                        [0] => 1_april_2012.pdf
                                    )
                                [_1_october_2012] => Array
                                    (
                                       [0] => 1_october_2012.pdf
                                    )
                                [_1_january_2013] => Array
                                    (
                                        [0] => 1_january_2013.pdf
                                        [1] => key_points.html
                                    )
                                [_1_july_2012] => Array
                                    (
                                        [0] => 1_july 2012.pdf
                                    )
                            )
                    )
                [search_and_rescue] => Array
                    (
                        [monthly] => Array
                            (
                                [_1_February_2013] => Array
                                    (
                                        [0] => 1_february_2013.pdf
                                    )
                            )
                        [annual] => Array
                            (
                                [_2012] => Array
                                    (
                                        [0] => 2012.pdf
                                    )
                            )
                        [quarterly] => Array
                            (
                                [_q3_2012] => Array
                                    (
                                        [0] => q3_2012.pdf
                                    )
                            )
                    )
            )
        [estate] => Array
            (
            )
    )
)

That's a little messy but you get the idea. Any attempt to wrap a sort() or an asort() around the variable in my model leads to an error. Which is why I think I might have to edit this function or maybe create me a new one...

Was it helpful?

Solution

You have to split up the array sort the files and directories separately since the dir names are in the keys and the file names are in the values.

$dir_map = dir_map_sort(directory_map('folder/name'));

/**
 * Sorts the return of directory_map() alphabetically
 * directories listed before files
 * 
 * Example:
 *  a_dir/
 *  b_dir/
 *  a_file.dat
 *  b_file.dat
 */
function dir_map_sort($array)
{
    $dirs = array();
    $files = array();

    foreach ($array as $key => $val)
    {
        if (is_array($val)) // if is dir
        {
            // run dir array through function to sort subdirs and files
            // unless it's empty
            $dirs[$key] = (!empty($array)) ? dir_map_sort($val) : $val;
        }
        else
        {
            $files[$key] = $val;
        }
    }

    ksort($dirs); // sort by key (dir name)
    asort($files); // sort by value (file name)

    // put the sorted arrays back together
    // swap $dirs and $files if you'd rather have files listed first
    return array_merge($dirs, $files); 
}

OR

/**
 * Sorts the return of directory_map() alphabetically
 * with directories and files mixed
 * 
 * Example:
 *  a_dir/
 *  a_file.dat
 *  b_dir/
 *  b_file.dat
 */
function dir_map_sort($array)
{
    $items = array();

    foreach ($array as $key => $val)
    {
        if (is_array($val)) // if is dir
        {
            // run dir array through function to sort subdirs and files
            // unless it's empty
            $items[$key] = (!empty($array)) ? dir_map_sort($val) : $val; 
        }
        else
        {
            $items[$val] = $val;
        }
    }

    ksort($items); // sort by key

    return $items;
}

OTHER TIPS

You can order in SQL select statement (ORDER BY XXX) or in controller use one of these methods at

[1]: http://php.net/manual/en/array.sorting.php php.net

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top