0

まず、PHP の既製のソート関数をいくつか探しました。http://php.net/manual/en/array.sorting.phpをいくつか見つけましたが、これは私のニーズをサポートしていませんでした。昇順だけでなく、可能であれば降順もソートしたかったのです。このための関数が見つかりませんでした (見逃していたら本当に申し訳ありません。そのような既製の関数がないとは信じられませんが、見つけることができませんでした)

。与えられた鍵。これには、文字と数字を含める必要があります。これにはstrnatcasecmp()を使用しましたが、これは完全に機能しました。

私の関数には 3 つのパラメーターがあります。1 つは並べ替える配列用、もう 1 つは昇順または降順の場合、もう 1 つは並べ替えるキー用です。
私が使用する配列の例を次に示します。

配列
(
    [test'l(ol.txt] => 配列
        (
            [名前] => test'l(ol
            [日付] => 1379595716
            [サイズ] => 0 b
            [拡張子] => txt
            [パス] => shared\test/test'l(ol.txt
            [親指] => images/files/txt.png
        )

    [test(2).txt] => 配列
        (
            [名前] => テスト(2)
            [日付] => 1379595716
            [サイズ] => 0 b
            [拡張子] => txt
            [パス] => shared\test/test(2).txt
            [親指] => images/files/txt.png
        )

    [test2.txt] => 配列
        (
            [名前] => test2
            [日付] => 1379595716
            [サイズ] => 0 b
            [拡張子] => txt
            [パス] => shared\test/test2.txt
            [親指] => images/files/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

4

1 に答える 1

1

uasort を使用して、指定されたパラメーターで並べ替えるカスタム関数を実装します。

于 2013-09-23T12:50:47.610 に答える