当"优先级"值相同时,对数组中的元素进行洗牌?

  • 本文关键字:元素 优先级 数组 php
  • 更新时间 :
  • 英文 :


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

这是我要做的示例:

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

    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

您需要洗牌,然后使用

编辑

$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

洗牌人
用户

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

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

这是另一种方法,可以避免您不得不弄乱数据。从您的基本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);

最新更新