【问题标题】:array_multisort appears sort is incorrectarray_multisort 出现排序不正确
【发布时间】:2014-07-21 01:33:32
【问题描述】:

我有几个包含团队数据的数组...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... team 10 应该是 Conf 2 Div 2 .. 等等。然后我运行我的 array_multsort:

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

这将我的 DivWinners 放在首位,然后按我的 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 中,它应该是最低的...而不是排名第二。

【问题讨论】:

  • $Teams 已排序,但 $Team 已打印。错别字?
  • @Fabricator 如果您指的是这部分:“请注意 z:1... team 10 应该是 Conf 2 Div 2”,我说的是“team”,这并不是一个错字。 .. 只是我在谈论 Teams 即兴变量。我仔细检查了代码,它确实是所有示例中使用的 $Teams。
  • 我指的是for debugging, I use a for loop and print the value of each... so $Team[$z] - $ConfNum[$z] - $DivNum[$z] ... etc.
  • @Fabricator 啊,我明白了。我仔细检查了代码,发现我实际上在使用 Teams...所以我的消息有误(错字)。

标签: php array-multisort


【解决方案1】:

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

在执行 array_multisort 之前,我决定在所有数组上打印_r...你瞧,每个数组都以不同的顺序打印(因为它们是创建/添加的)。所以对于第 10 队(列表中的第 2 队),第二个 ConfNum 确实是 1,尽管密钥 $z 是针对另一个队的。

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

在开始使用 array_multisort 之前,我可以通过对所有数组执行 ksort() 来纠正这个问题。

这样做确实纠正了我的问题...所有数组似乎都报告了正确的数字和正确的顺序。

感谢所有花一点时间思考我的问题的人。

【讨论】:

    【解决方案2】:

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

    <?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;?>
    
    团队 conf div 排名冠军系列 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

    或者您的代码可能在其他地方出现错误。

    【讨论】:

    • 我又查看了每个数组的 print_r ......它们按照输入的顺序排列,所以键 1、4、2 等......不是 1、2、3。 .. 似乎我需要在 array_multisort 之前做一个 ksort (正如我在下面的回答中指出的那样)。感谢您让我再次检查代码。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2017-08-18
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多