【问题标题】:PHP - Custom sort function improvementPHP - 自定义排序功能改进
【发布时间】:2013-09-23 12:42:04
【问题描述】:

我首先寻找一些 PHP 的预制排序函数。我确实找到了一些 http://php.net/manual/en/array.sorting.php ,但这不支持我的需求。如果可能的话,我不仅想升序排序,还想降序排序。我找不到这个功能(如果我错过了我真的很抱歉。我很难相信没有这样的预制功能,但找不到它)

我只是想要一个按给定键对数组进行排序的排序函数。这应该包括字母和数字。为此,我使用了strnatcasecmp(),效果很好。

我的函数有 3 个参数:一个用于排序的数组,一个用于升序或降序,一个用于排序的键。
这是我使用的数组的示例:

大批 ( [test'l(ol.txt] => 数组 ( [名称] => test'l(ol [日期] => 1379595716 [大小] => 0 b [扩展名] => txt [路径] => 共享\测试/测试'l(ol.txt [拇指] => 图像/文件/txt.png ) [test(2).txt] => 数组 ( [名称] => 测试(2) [日期] => 1379595716 [大小] => 0 b [扩展名] => txt [路径] => shared\test/test(2).txt [拇指] => 图像/文件/txt.png ) [test2.txt] => 数组 ( [名称] => test2 [日期] => 1379595716 [大小] => 0 b [扩展名] => txt [路径] => 共享\test/test2.txt [拇指] => 图像/文件/txt.png ) )


我的功能:

function sorteer($aNamen, $bAsc, $sAction)
{
    foreach($aNamen as $array)
    {
            $keyNaams[] = $array[$sAction];
    }

    //$for = '$i=0;$i < count($aNamen); $i++';
    $iStart = 0;
    $iEnd = count($keyNaams);
    $iPlus = 1;

    if($bAsc == true)
    {
        //$for = '$i=count($aNamen)-1;$i > 0; $i--';
        $iStart = count($keyNaams)-1;
        $iEnd = 0;
        $iPlus = -1;

        echo " <style type='text/css'>
                ." .$sAction. "
                {
                    -webkit-transform:scaleY(-1) !important;
                }
                </style>";
    }


    for($x=0;$x < count($keyNaams)*count($keyNaams); $x++)
    {
        //for($i = $iStart;$i .$forPar2. $evalPar3;$i. $forPar4)
        for($i=$iStart;$i != $iEnd; $i += $iPlus)
        {
            if(!empty($keyNaams[$i + $iPlus]))
            {
                if(strnatcasecmp($keyNaams[$i], $keyNaams[$i + $iPlus]) > 0) //string 1 groter dan string 2
                {
                    //echo $keyNaams[$i] .' is groter dan '. $keyNaams[$i - 1];
                    $nameTemp = $keyNaams[$i];
                    $keyNaams[$i] = $keyNaams[$i + $iPlus];
                    $keyNaams[$i + $iPlus] = $nameTemp;
                }
            }

        }
    }

    foreach($keyNaams as $name)
    {
        foreach($aNamen as $array)
        {
            if($array[$sAction] == $name)
            {
                $values = array_values($array);
                $key = array_keys($array);
                $i = 0;
                //$mapsSort = array();
                foreach($values as $test)
                {
                    if(!isset($mapsSort[$array['name']]))
                    {
                        $mapsSort[$array['name']] = array(
                                $key[$i] => $values[$i]
                        );
                    }

                    $arr = array(
                            $key[$i] => $values[$i]
                    );

                    $mapsSort[$array['name']] = array_merge($mapsSort[$array['name']], $arr);

                    $i = $i + 1;
                }

            }
        }
    }

    return $mapsSort;
}

它首先对键名进行排序,然后使用排序后的键名来获取数组的其他属性。它将返回所有文件属性的数组。

问题:

现在的问题是当你有一个大数组时它真的很慢。加载有时需要 10 秒。现在我想知道是否有可能使这个函数更快一些?
我试图使这个函数尽可能动态。
我希望我能很好地解释我对该函数的想法。我真的希望有人有一些技巧来改进这个功能。
非常感谢任何帮助,Nkmol

【问题讨论】:

    标签: php arrays codeigniter sorting optimization


    【解决方案1】:

    使用uasort并实现一个自定义函数,按给定参数排序。

    【讨论】:

    • 难道uasort不只支持升序吗?
    • 它以您的用户函数指定的方式排序。比较函数是您自己构建的,您决定何时返回 1 或 -1。
    • 谢谢先生!下次我应该多读一些手册。使用了这个例子:php.net/manual/en/function.uasort.php#100279 它确实生成得非常快,谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多