当'priority'值相同时,在数组中洗牌元素?

时间:2012-10-29 19:52:49

标签: php

我有一个键控数组,每个插槽包含两条信息:公司名称和优先级。我试图找到一种方法来洗牌具有相同优先级值的公司名称。我熟悉shuffle函数,但是,我不想在数组中忽略优先级值的所有元素,我想只调整具有相同优先级值的元素。

这是我想要做的一个例子:

注意:以下所有元素都在同一个数组中

    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

3 个答案:

答案 0 :(得分:2)

你需要随便洗牌,然后再使用

修改

$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

答案 1 :(得分:1)

在使用usort进行排序时,当您拥有相同的优先权时,可以通过添加到数组中每个元素的随机facotr进行排序:

$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;
    }
}

这是低效的,在最坏的情况下它可以永远运行,因为在比较相同的元素时没有恒定的结果

答案 2 :(得分: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);