2012-10-29 23 views
2

我有一个键控阵列,每个插槽包含两条信息:公司名称和优先级。我试图找到一种方法来洗牌具有相同优先级值的公司名称。我熟悉shuffle函数,但是,我不想忽略数组中的所有元素而忽略优先级值,我只想对具有相同优先级值的元素进行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

把它放在一个数据库,并编写一个查询。或使用'usort' http://php.net/manual/en/function.usort.php – wesside

+0

shuffle($ myArray);然而,这将洗牌所有元素,而忽略优先级值,这不是我想要的... – AnchovyLegend

+0

@bigman我已经使用usort按优先顺序进行排序...请详细说明这将如何帮助我解决上述问题。 – AnchovyLegend

回答

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

1

虽然与usort排序,当你有相同priories,排序随机facotr加到每个EL EMENT数组中:

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

不要试图像下面每个相同的优先级返回随机结果:

​​

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

+0

第一种方法打破了比较器的不变性,这意味着排序也在其违反其承诺的权利范围内 - 例如它可能会决定永远运行。我真的觉得它应该是什么*不*做的一个例子,而不是你的答案的一部分。 – Jon

+0

@Jon这就是我想说的,但现在看我的答案,我看到它没有清楚解释,谢谢指出。 –

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); 
相关问题