1

私は、多次元配列の並べ替えとシャッフルが必要なゲーム プロジェクトに取り組んでいます。まず、入札に基づいて並べ替える必要があります。複数の入札が同じ場合、優先順位に基づいて並べ替える必要があります。入札と優先度の両方が同じ場合、それらの要素をシャッフルする必要があります。たとえば、bid=0.4 & priority=4 に 3 つの配列要素があります。ID は 102、103、および 104 です。これらの配列要素の位置はシャッフルする必要があります。

array(
    array('id' => 101, 'bid' => 0.5, 'priority' => 5),
    array('id' => 102, 'bid' => 0.4, 'priority' => 4),
    array('id' => 103, 'bid' => 0.4, 'priority' => 4),
    array('id' => 104, 'bid' => 0.4, 'priority' => 4),
    array('id' => 105, 'bid' => 0.3, 'priority' => 5),
    array('id' => 106, 'bid' => 0.3, 'priority' => 5),
    array('id' => 107, 'bid' => 0.2, 'priority' => 5),
    array('id' => 108, 'bid' => 0.7, 'priority' => 5),
    array('id' => 108, 'bid' => 0.1, 'priority' => 4)
);
4

7 に答える 7

4

これを行うには、 array_multisortを確認する必要があります。そのページには、多次元配列をソートする方法の例があります

<?php
// Obtain a list of columns
foreach ($data as $key => $row) {
  $bid[$key]  = $row['bid'];
  $prio[$key] = $row['priority'];
}

array_multisort($bid, SORT_ASC, $prio, SORT_ASC, $data);
?>

シャッフルするには、「rand」と呼ばれる多次元配列に列を追加し、マルチソートを使用する前に乱数を入力します。次に、シャッフルのためにその列に 3 番目の並べ替え順序を追加できます。

于 2013-05-07T08:07:37.463 に答える
2

ランダムな重みの使用に関する@Hugoの回答のアイデアに基づいています:

$array = array(
    array('id' => 101, 'bid' => 0.5, 'priority' => 5),
    array('id' => 102, 'bid' => 0.4, 'priority' => 4),
    array('id' => 103, 'bid' => 0.4, 'priority' => 4),
    array('id' => 104, 'bid' => 0.4, 'priority' => 4),
    array('id' => 105, 'bid' => 0.3, 'priority' => 5),
    array('id' => 106, 'bid' => 0.3, 'priority' => 5),
    array('id' => 107, 'bid' => 0.2, 'priority' => 5),
    array('id' => 108, 'bid' => 0.7, 'priority' => 5),
    array('id' => 108, 'bid' => 0.1, 'priority' => 4)
);
function cmp(&$a, &$b) {                                     # notice the use of & in function signature
    if ($a['bid'] - $b['bid']) {
        return $a['bid'] - $b['bid'] > 0 ? 1 : -1;           # bid is different, sort using bid
    } else if ($a['priority'] - $b['priority']) {
        return $a['priority'] - $b['priority'] > 0 ? 1 : -1; # priority is different, sort using priority
    } else {
        if (isset($a['rw']) == false) {
            $a['rw'] = rand(1, 100);                         # assign random tie breaker
        } 
        if (isset($b['rw']) == false) {
            $b['rw'] = rand(1, 100);                         # assign random tie breaker
        } 
        if ($a['rw'] - $b['rw']) {
            return $a['rw'] - $b['rw'] > 0 ? 1 : -1;         # sort using random weight
        } else {
            return 0;
        }
    }
}
usort($array, 'cmp');
var_dump($array);

出力

array(9) {
[0]=>array(3) {["id"]=>int(108) ["bid"]=>float(0.1) ["priority"]=>int(4)}
[1]=>array(3) {["id"]=>int(107) ["bid"]=>float(0.2) ["priority"]=>int(5)}
[2]=>array(4) {["id"]=>int(106) ["bid"]=>float(0.3) ["priority"]=>int(5) ["rw"]=>int(70)}
[3]=>array(4) {["id"]=>int(105) ["bid"]=>float(0.3) ["priority"]=>int(5) ["rw"]=>int(73)}
[4]=>array(4) {["id"]=>int(103) ["bid"]=>float(0.4) ["priority"]=>int(4) ["rw"]=>int(29)}
[5]=>array(4) {["id"]=>int(104) ["bid"]=>float(0.4) ["priority"]=>int(4) ["rw"]=>int(67)}
[6]=>array(4) {["id"]=>int(102) ["bid"]=>float(0.4) ["priority"]=>int(4) ["rw"]=>int(80)}
[7]=>array(3) {["id"]=>int(101) ["bid"]=>float(0.5) ["priority"]=>int(5)}
[8]=>array(3) {["id"]=>int(108) ["bid"]=>float(0.7) ["priority"]=>int(5)}
}
于 2013-05-07T08:27:50.880 に答える
1

使用できますusort

usort($array,function ($a, $b) {

            if ($a['id'] == $b['id']) {
                if ($a['priority'] == $b['priority'] && $a['bid'] == $b['bid']) {
                    $pos = array(-1,0,1);
                    return $pos[mt_rand(0, 2)]; // shurffle
                }

                $a = $a['priority'];
                $b = $b['priority'];

                return ($a == $b) ? 0 : (($a > $b) ? - 1 : 1); // sorty by priority
            }

            // First i need to sort based on bid
            $a = $a['id'];
            $b = $b['id'];
            return ($a == $b) ? 0 : (($a < $b) ? - 1 : 1); //sort by bid id
    });
于 2013-05-07T08:16:16.353 に答える
1

この状況には usort が理想的ですhttp://www.php.net/manual/en/function.usort.php比較を行う関数を定義し
ます

<?php
function cmp($a, $b)
{
    if ($a['bid'] == $b['bid']) {
        if ($a['priority'] == $b['priority']) return 0;
        return ($a['priority'] < $b['priority']) ? -1 : 1;
    }
    return ($a['bid'] < $b['bid']) ? -1 : 1;
}

usort($data, "cmp");
?>
于 2013-05-07T08:15:26.503 に答える
-1
  • シャッフルする要素を配列に入れ、初期配列が空になるまでそれらを初期配列から削除します。
  • shuffle作成された配列を呼び出す
  • シャッフルされた配列を結果とともに新しい配列に入れます。
于 2013-05-07T08:08:35.127 に答える