phparrayssortingcodeigniterhelper

How to sort an array created by the directory_helper in CodeIgniter


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...


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;
    }