0

次のタイプの配列があります。

$foo = array(
         "a" => 1,
         "b" => 1,
         "c" => 2,
         "d" => 2,
         "e" => 3,
         "f" => 3,
         "g" => 4,
         "h" => 4,
         "i" => 5,
         "j" => 5,
         "k" => 10,
         "l" => 12,
         "m" => 15,
         "n" => 20
       );

この方法で配列をソートする必要があります:

$foo = array(1,2,3,4,5,12,20,15,10,5,4,3,2,1);

ご覧のとおり、最良の値は配列の中央にある必要があります。そして、配列の開始/終了の最小値。キーは元の値にリンクする必要があります。

助けてくれてありがとう!私の英語でごめんなさい。

4

3 に答える 3

4

入力が既にソートされている場合は、2 つのループを使用して、最初にオフセットが奇数のすべてのアイテムを昇順でプッシュし、次にオフセットが偶数のアイテムを降順で配列にプッシュできます。

$keys = array_keys($foo);
$n = count($keys);
$result = array();
for ($i=0; $i<$n; $i+=2) {
    $result[$keys[$i]] = $foo[$keys[$i]];
}
for ($i=$n-$n%2-1; $i>0; $i-=2) {
    $result[$keys[$i]] = $foo[$keys[$i]];
}
于 2013-02-10T18:55:35.120 に答える
1

まず、すべての整数を昇順に並べます。$foo_asが昇順で取得した新しい配列であるとしましょう。

$a=a new empty array of size $n

$n=number of integers.
$c=0;
for ($i=$n-1;$i>0;$i--){
   if (i%2==0){
      $a(i/2)+c=$foo_as($n-$c)
   }
   else{
      $a(i+1/2)-c=$foo_as($n-$c)
   }
   $c++
}

説明:最大の整数を中央に配置しています。その後、真ん中のインデックスの周りの代替インデックスに、降順の整数を入力します。

-   -   -   -   -   11  -   -   -   -   -
-   -   -   -   10  11  -   -   -   -   -
-   -   -   -   10  11  9   -   -   -   -
-   -   -   8   10  11  9   -   -   -   -
-   -   -   8   10  11  9   7   -   -   -
-   -   6   8   10  11  9   7   -   -   -
-   -   6   8   10  11  9   7   5   -   -
-   4   6   8   10  11  9   7   5   -   -
-   4   6   8   10  11  9   7   5   3   -
2   4   6   8   10  11  9   7   5   3   -
2   4   6   8   10  11  9   7   5   3   1

これを実証するために、基本的なアルゴリズムを使用しました。ある時点で私のphp構文が正しくない場合は、それを省略してください。

于 2013-02-10T19:06:41.100 に答える
0

やり過ぎバージョン:

<?php
$foo = array(
        "a" => 1,
        "b" => 1,
        "c" => 2,
        "d" => 2,
        "e" => 3,
        "f" => 3,
        "g" => 4,
        "h" => 4,
        "i" => 5,
        "j" => 5,
        "k" => 10,
        "l" => 12,
        "m" => 15,
        "n" => 20
);

$arrayKeys = array_keys($foo);
$arrayValues = array_values($foo);

$array_count = count($foo);
for ($idx =0; $idx < round($array_count/2); $idx+=2) {
    $tmpA = $arrayKeys[$idx];
    $arrayKeys[$idx] = $arrayKeys[$array_count - $idx -1];
    $arrayKeys[$array_count - $idx -1] = $tmpA;

    $tmpB = $arrayValues[$idx];
    $arrayValues[$idx] = $arrayValues[$array_count - $idx -1];
    $arrayValues[$array_count - $idx -1] = $tmpB;
}

$tmpArray = array_combine($arrayKeys, $arrayValues);

$ascent = array_slice($tmpArray, 0, round($array_count/2));
$descent = array_slice($tmpArray, round($array_count/2));

asort($ascent);
arsort($descent);

$foobar = array_merge($ascent, $descent);

var_dump($foo, $foobar);
?>
于 2013-02-10T19:39:30.060 に答える