0

PHP配列のソート関数を調べて、次のことを行う方法を見つけていますが、それを管理できないようです。

Array ( 
[77] => 79
[72] => 78
[71] => 78
[82] => 79
[76] => 79
[73] => 78
[75] => 78 )

再注文したい

Array ( 
[72] => 78
[71] => 78
[73] => 78
[75] => 78
[77] => 79
[82] => 79
[76] => 79 )

キーが元の順序を尊重する方法に注意してください。値に従って配置されているだけです(したがって、79 の最初の 77 は 79 の最初のままです)。

aasort が機能すると思ったが、機能しなかった

asort($categories);
foreach ($categories as $key => $val) {
    echo "$key = $val\n";
    echo "<br>";
}

出力 (等号はご容赦ください)

74 = 78
85 = 78
75 = 78
73 = 78
70 = 78
71 = 78
72 = 78
82 = 79
86 = 79
81 = 79
77 = 79
80 = 79
76 = 79 
4

4 に答える 4

3

マークが示唆するように、これをバブルソートの実装に統合することはおそらく可能ですが、速度にはトレードオフがあります。そもそも速度が問題にならない場合は、必要なことを行う単純な実装を次に示します。

特定の値にどのキーが使用されたかを単純にカウントし、最終的に並べ替えられた配列がその順序に従っていることを確認します。

function sort_keys_intact(&$a) {
    $b = array();
    $values = array();
    foreach ( $a as $k => $v ) {
        $values[$v][] = $k;
    }
    asort($a);
    $used = 0;
    foreach ( $a as $k => $v ) {
        if ( $used == count($values[$v]) + 1 ) {
            $used = 0;
        }
        $b[$values[$v][$used]] = $v;
        $used++;
    }
    $a = $b;
}

試運転

echo 'Before:' . PHP_EOL;
print_r($categories);
sort_keys_intact($categories);
echo 'After:' . PHP_EOL;
print_r($categories);

出力:

Before:
Array
(
    [77] => 79
    [72] => 78
    [71] => 78
    [82] => 79
    [76] => 79
    [73] => 78
    [75] => 78
)
After:
Array
(
    [72] => 78
    [71] => 78
    [73] => 78
    [75] => 78
    [77] => 79
    [82] => 79
    [76] => 79
)
于 2013-08-09T18:33:49.667 に答える
0

PHP に慣れていないので、PHP でそれを行う方法がわかりません (おそらくそれが問題です) が、次のような 2 番目のリストを作成できます。

[77] => (79,1)
[72] => (78,2)
[71] => (78,3)
[82] => (79,4)
[76] => (79,5)
[73] => (78,6)
[75] => (78,7)

これは、元の値と順序の値を持つタプルです。並べ替えを実行してから、それぞれの順序を削除して、目的の形式を生成します。

于 2013-08-09T18:10:08.707 に答える
0

答えがうまくいかなかったので、この問題を解決するために自分の関数を書きました:

function sort_value_leave_key(&$arr){

$z = array();
foreach ($arr as $k => $v){
    $z[$v.rand(1111,9999)] = $k;
}
krsort($z);

$arr = array();
foreach($z as $k => $v){
    $arr[$v] = substr($k,0,-4);
}

}
于 2014-03-19T23:55:35.670 に答える