2

私はキー配列を持っています。各スロットには、会社名と優先度という 2 つの情報が含まれています。同じ優先順位の値を持つ会社名をシャッフルする方法を見つけようとしています。私はシャッフル機能に精通していますが、優先度の値を無視して配列内のすべての要素をシャッフルしたくありません。同じ優先度の値を持つ要素のみをシャッフルしたいと考えています。

これが私がやろうとしていることの例です:

注:次の要素はすべて同じ配列にあります。

    McDonalds, 10
    Marshalls, 10
    Dillards,  10
    Burger King, 5
    Hunan Palace, 5
    Taco Bell, 5
    Pizza Hut, 5
    Macy's, 2
    Prudential, 2
    Nike, 2
    Billabong, 2

私は次のようなもので終わりたいと思います:

        Marshalls, 10
        Dillards,  10
        McDonalds, 10
        Hunan Palace, 5
        Burger King, 5
        Pizza Hut, 5
        Taco Bell, 5
        Nike, 2
        Macy's, 2
        Billabong, 2
        Prudential, 2
4

3 に答える 3

2

あなたはシャッフルする必要があり、その後usortします

編集

$array = array(
   array('company' => 'McDonalds', 'priority' => 10),
   array('company' => 'Marshalls', 'priority' => 10),
   //...
);

shuffle($array); //shuffles (randomizes the order of the elements in) an array

function custom_sort($left, $right) {
    return $right['priority'] - $left['priority'];
}

usort($array, "custom_sort"); // sort by user-defined comparison function

shuffle man
usort man

于 2012-10-31T07:31:46.667 に答える
1

でソートしてusortいるときに、優先度が等しい場合は、配列の各要素にランダムな要素を追加してソートします。

$myArray = array(
   array('company' => 'McDonalds', 'priority' => 10),
   array('company' => 'Marshalls', 'priority' => 10),
);

foreach($myArray as &$elem){
    //add new property
    $elem['random_factor'] = rand(0,65535);
}

次に、優先順位で並べ替え、次にランダムな要因で並べ替えます。

function sort_and_shuffle($a,$b){
    if($a['priority'] == $b['priority']){
        if($a['random_factor'] == $b['random_factor']){
            return 0;
        }
        return return ($a['random_factor'] < $b['random_factor']) ? -1 : 1;
    }else{
        return return ($a['priority'] > $b['priority']) ? -1 : 1;
    }
}

以下のように、同じ優先度ごとにランダムな結果を返そうとしないでください。

function sort_and_shuffle($a,$b){
    if($a['priority'] == $b['priority']){
        return rand(-1,1);
    }else{
        return return ($a['priority'] > $b['priority']) ? -1 : 1;
    }
}

同じ要素を比較しても一定の結果が得られないため、効率が悪く、最悪の場合、永久に実行される可能性があります。

于 2012-10-29T20:17:38.647 に答える
0

これは、データをいじる必要を回避する別の方法です。usort()基本的な通話から始めます。

$places = array(
    array('name'=>'Marshalls', 'priority'=>10),
    array('name'=>'Pizza Hut', 'priority'=>5),
    ...
);

usort($places, function($left, $right) {
    return $right['priority'] - $left['priority'];
});

ここで、小さな配列を取り、それをシャッフルして、より大きな配列に追加する関数が必要です。

function shuffleAndAppend(&$temp, &$final) {
    shuffle($temp);
    array_splice($final, count($final), 0, $temp);
    $temp = array();
}

これで、並べ替えられた配列をループして、同じ優先度のアイテムをグループ化し、それらをシャッフルしてから、最終的な配列に追加できます。

$shuffledPlaces = array();
$tempPlaces = array();
$lastPriority = -1;

foreach ($places as $onePlace) {
    if ($onePlace['priority'] != $lastPriority)
        shuffleAndAppend($tempPlaces, $shuffledPlaces);
    array_push($tempPlaces, $onePlace);
    $lastPriority = $onePlace['priority'];
}
shuffleAndAppend($tempPlaces, $shuffledPlaces);

print_r($shuffledPlaces);
于 2012-10-29T20:45:24.053 に答える