array_multisort出现排序不正确

时间:2014-07-21 01:33:33

标签: php array-multisort

我有几个包含团队数据的数组... array_multisort()似乎没有保持团队数据关联。我有这样的事情:

Teams[$z] = various strings
ConfNum[$z] = various strings
$DivNum[$z] = various strings
$DivWinner[$z] = integer of 1 or 0.
$TeamRank[$z] = integer of the team's rank

用于调试,我使用for循环并打印每个的值......所以$Teams[$z] - $ConfNum[$z] - $DivNum[$z] ...等。

我跑array_multisort()(过去我曾多次使用过这种情况)突然之间的关联不再存在。

这是我的调试。

在array_multisort之前:

key - Teams - Conf - Div - Rank - DivWin - Series
z:0 -   3 -    2 -   2 -    0  -  1 -      1
z:1 -   10 -   2 -   7 -    8  -  1 -      2
z:2 -   75 -   2 -   2 -    2  -  0 -      3
z:3 -   11 -   2 -   2 -    5  -  0 -      4
z:4 -   55 -   1 -   1 -    1  -  1 -      5
z:5 -   79 -   1 -   6 -    3  -  1 -      6
z:6 -   67 -   1 -   6 -    4  -  0 -      7
z:7 -   4 -    1 -   1 -    6  -  0 -      8

请注意z:1 ...团队10应该是Conf 2 Div 2 ..等我然后运行我的array_multsort:

array_multisort($DivWinner,SORT_DESC,$TeamRank,$Teams,$ConfNum,$DivNum,$SeriesID);

这会将我的DivWinner置于顶部,然后按我的TeamRank排序。我包括Teams,ConfNum,DivNum,SeriesID,因为我想在排序后维护所有这些数组的关联。

排序后我得到了这个:

key -  Teams - Conf - Div - Rank - DivWin - Series
z:0 -   3 -    2 -    2 -   0  -   1 -      1
z:1 -   10 -   1 -    1 -   1  -   1 -      2
z:2 -   11 -   1 -    6 -   3  -   1 -      4
z:3 -   4 -    2 -    7 -   8  -   1 -      8
z:4 -   75 -   2 -    2 -   2  -   0 -      3
z:5 -   55 -   1 -    6 -   4  -   0 -      5
z:6 -   79 -   2 -    2 -   5  -   0 -      6
z:7 -   67 -   1 -    1 -   6  -   0 -      7

现在我们再来看看10队。

现在设置为Conf 1 Div 1 ...完全不正确。

这是一个DivWinner(设置为1)所以它应该排名"更高"但是,TeamRank是8 ...所以在四个DivWinners中,它应该是最低的...而不是#&#34 39; s排名第二。

2 个答案:

答案 0 :(得分:1)

所以......我一直在根据$ Teams数组关联的密钥创建数组...我查找$ Teams [$ z]的ConfNum,DivNum等,并将其插入$ ConfNum [ $ z]数组。

在我执行array_multisort之前,我决定在所有数组上使用print_r ...看,每个数组以不同的顺序打印(因为它们是创建/添加的)。因此,对于10队(这是列表中的第2队),第二个ConfNum确实是1,即使关键的$ z是另一个团队。

当我执行array_multisort时,它没有考虑键,而是根据值添加到每个数组的顺序进行排序。

在我开始使用array_multisort之前,我能够通过对所有数组执行ksort()来解决这个问题。

这样做肯定纠正了我的问题......所有阵列似乎都按照正确的顺序报告了正确的数字。

感谢大家花了一点时间思考我的问题。

答案 1 :(得分:0)

我相信你打印排序数组的方式有一个错误,这就是我尝试过的,它似乎有效。

<?php
$Teams = array(3,10,75,11,55,79,67,4);
$ConfNum = array(2,2,2,2,1,1,1,1);
$DivNum = array(2,7,2,2,1,6,6,1);
$DivWinner = array(1,1,0,0,1,1,0,0);
$rank = array(0,8,2,5,1,3,4,6);
$series = array(1,2,3,4,5,6,7,8);

array_multisort($DivWinner,SORT_DESC,$Teams,$ConfNum,$DivNum, $rank, $series);


?><table>
<tr>
<th>teams</th>
<th>conf</th>
<th>div</th>
<th>rank</th>
<th>winner</th>
<th>series</th>
</tr>
<tbody>
<?php for($i = 0;$i < count($Teams); $i++):?>
  <tr>
    <td><?php echo $Teams[$i]?></td>
    <td><?php echo $ConfNum[$i]?></td>
    <td><?php echo $DivNum[$i]?></td>
    <td><?php echo $rank[$i]?></td>
    <td><?php echo $DivWinner[$i]?></td>
    <td><?php echo $series[$i]?></td>
  </tr>
<?php endfor;?>
teams conf  div rank  winner  series
3     2     2   0     1       1
10    2     7   8     1       2
55    1     1   1     1       5
79    1     6   3     1       6
4     1     1   6     0       8
11    2     2   5     0       4
67    1     6   4     0       7
75    2     2   2     0       3

或许你的代码在其他地方被窃听。