如何对CodeIgniter中的directory_helper创建的数组进行排序

问题描述 投票:0回答:2

所以我在目录助手中使用directory_map函数,我想知道如何编辑该函数(或者扩展它或其他东西),以便它对它给我的多维数组进行排序。

这是它当前生成的数组;

 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
            (
            )
    )
)

这有点乱,但你明白了。任何尝试将 sort() 或 asort() 包装在模型中的变量周围都会导致错误。这就是为什么我认为我可能必须编辑这个函数或者为我创建一个新函数......

php arrays sorting codeigniter helper
2个回答
4
投票

您必须拆分数组,分别对文件和目录进行排序,因为目录名称位于键中,文件名位于值中。

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

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

-2
投票

您可以在 SQL select 语句 (ORDER BY XXX) 中进行排序,或者在控制器中使用以下方法之一

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

© www.soinside.com 2019 - 2024. All rights reserved.