我有一个键控数组,每个插槽包含两条信息:公司名称和优先级。我试图找到一种方法来洗牌具有相同优先级值的公司名称。我熟悉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
答案 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
答案 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);