0

重複の可能性:
PHPで多次元配列をソートするにはどうすればよいですか

複雑な配列をソートしてマージする必要があります。配列は多次元であり、サブ配列は次のように 2 つのキー/値を使用します。

<?php
$result = array(
array("1", "20"),
array("1", "33"),
array("2", "10"),
array("2", "25"),
array("2", "7"),
array("3", "33"),
array("3", "80"),
array("4", "300")
);
print_r($result);
?>

ここで、キー [0] の値が類似しているキー [1] 値 (サブ配列内) の集計に基づいて並べ替え、マージしてから並べ替える必要があります。たとえば、上記の結果は次のようになります。

Array
(
    [0] => Array
        (
            [0] => 4
            [1] => 300
        )

    [1] => Array
        (
            [0] => 3
            [1] => 113
        )

    [2] => Array
        (
            [0] => 1
            [1] => 53
        )

    [3] => Array
        (
            [0] => 2
            [1] => 42
        )

)

私の説明が十分に明確であることを願っています。

4

2 に答える 2

1

ここで重要なのはarray_multisort関数ですが、正しい形式で入力を取得するにはいくつかの作業が必要です。以下のコードを見てください。最初に値を累積し、次にそれをインデックス配列と値配列に分割し、マルチソートでソートしてマージします。

$result2 = array();
foreach($result as $pair) {
    if  (!isset($result2[$pair[0]]))
        $result2[$pair[0]] = 0;
    $result2[$pair[0]] += $pair[1];
}
$array1 = array();
$array2 = array();
foreach($result2 as $key => $value) {
    array_push($array1, $key);
    array_push($array2, $value);
}
array_multisort($array2, SORT_DESC, $array1);
$result3 = array();
for ($i = 0; $i < count($array1); $i++) {
    array_push($result3, array($array1[$i], $array2[$i]));
}
print_r($result3);
于 2012-10-16T21:43:54.923 に答える
0

特定のケースでは、2 つの操作 (合計の集計、並べ替え配列の作成) を 1 つの反復に圧縮できます。

ただし、コードは読みにくくなります。

list($sort, $result) = array_reduce($result, function($a, $v) {
    $a[1][$v[0]] = [$v[0], (@$a[0][$v[0]] += $v[1])];
    return $a;
}, []);

array_multisort($sort, SORT_NUMERIC, SORT_DESC, $result);
于 2012-10-16T22:09:45.643 に答える