PHP - 拆分多维数组唯一值

时间:2014-05-21 10:46:38

标签: php arrays multidimensional-array

如果我首先解释一下它会有所帮助......我参加的比赛中每个县有3名获胜者(投票率最高的人)。

我当前的数组如下所示:

Array
(
    [0] => Array
        (
            [entryID] => 1
            [votes] => 3
            [countyID] => 46
        )

    [1] => Array
        (
            [entryID] => 4
            [votes] => 1
            [countyID] => 2
        )

    [2] => Array
        (
            [entryID] => 2
            [votes] => 0
            [countyID] => 46
        )

    [3] => Array
        (
            [entryID] => 5
            [votes] => 0
            [countyID] => 46
        )

)

我需要做的是找出在每个CountyID中找到前3名最高票数的方法。

我是如何实现这一目标的? 谢谢, 斯科特。

3 个答案:

答案 0 :(得分:1)

最简单的方法是重新组织你的数组,以便国家ID是顶级索引,然后只需编写一个简单的自定义函数来按降序对投票计数进行排序......这样最高投票条目在最前面。

$entries = array(
    array('entryId' => 1, 'votes' => 3, 'countryId' => 46),
    array('entryId' => 4, 'votes' => 1, 'countryId' => 2),
    array('entryId' => 2, 'votes' => 0, 'countryId' => 46),
    array('entryId' => 5, 'votes' => 0, 'countryId' => 46),
);

// Sort votes in descending order (most on top)
function voteSort($a, $b) {
    if ($a['votes'] == $b['votes']) {
        return 0;
    }
    return ($a['votes'] < $b['votes']) ? 1 : -1;
}

// Re-organize the array with country as top level
$byCountry = array();
foreach ($entries as $entry) {
    $byCountry[$entry['countryId']][] = array(
        'entryId' => $entry['entryId'],
        'votes'   => $entry['votes']
    );
}

// For each country, sort by votes
foreach ($byCountry as $index => $country) {
    usort($byCountry[$index], 'voteSort');
}

这应该有效。

答案 1 :(得分:0)

函数ksort()会有所帮助。
您可以先使用排名对数组进行排序,然后对国家/地区进行排序。因此,你将在阵列开始时的每个国家拥有所有的第一,然后是秒,等等 您将传递给ksort的函数将是

function compareVote($a,$b){
  if($a['votes'] > $b['votes'])
    return 1;

  if($a['votes'] == $b['votes']){
    if($a['countyID'] > $b['countyID'])
      return 1;
    if($a['countyID'] == $b['countyID'])
      return 0;

    return -1;
  }

return -1;
}

查看official doc page

答案 2 :(得分:0)

您可以通过以下方式按唯一的国家/地区ID拆分数组:

$entries = array(
 array('entryID' => 1, 'votes' => 3, 'countryID' => 46),
 array('entryID' => 4, 'votes' => 1, 'countryID' => 2),
 array('entryID' => 2, 'votes' => 0, 'countryID' => 46),
 array('entryID' => 5, 'votes' => 0, 'countryID' => 46),
);

$entriesByCountry = array();

foreach($entries as $entry) {
 if(!array_key_exists($entry->countyID, $entriesByCountry)
  $entriesByCountry[$entry->countyID] = array();

 $entriesByCountry[$entry->countyID][] = $entry;
}

然后按投票排序每个国家/地区阵列并取第3个。