我有一个键入的数组,每个插槽包含两个信息:公司名称和优先级。我正在尝试找到一种用相同优先级值的公司名称的方法。我熟悉洗牌函数,但是,我不想忽略优先级值中的所有元素,我只想将具有相同优先级值的元素进行调整。
这是我要做的示例:
注意:以下所有元素都在同一数组中
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);