【问题标题】:php sort array by $array[*][sum of this]php 按 $array[*][sum of this] 对数组进行排序
【发布时间】:2015-11-16 00:21:36
【问题描述】:

我有一个多维数组,用于存储有关游戏中玩家的信息。它为每个玩家存储了一个数组,每个玩家都是一个信息数组。每个玩家中的一个值是一个分数数组。 我想按照总分从高到低的顺序将我的数据输出到表格中。

目前,输出没有特定的顺序。我知道获得总分的唯一方法是array_sum($allplayers[0][2]) 或类似的。如何对数组$allplayers 进行排序,以便当我循环遍历它以输出结果时,它将从最高的array_sum 开始并向下工作?

数组示例:

//I want to sort $Allplayers by sum of key [3]
$Allplayers ( [0] => Array (
                  [0] => Winning 
                  [1] => 224 
                  [4] => 0 
                  [2] => Array ( [0] => 107 [1] => 114 [3] => 104  ) 
                  [3] => Array ( [0] => 107 [1] => 114 ) )
             [1] => Array ( 
                  [0] => Losing 
                  [1] => 225  
                  [2] => Array ( [0] => 76 )  
                  [3] => Array ( [0] => 76 )  
                  [4] => 1 )

【问题讨论】:

  • usort()与比较总和的回调一起使用
  • @MarkBaker 感谢您的链接。我以前做过一次,但并没有完全理解它。我现在在函数后面有这行代码usort(array_sum($allplayers[][3]),"cmp");。我应该在第一个 [] 之间放什么?那是我不明白的。再次感谢
  • 请您发布数组它会清除问题。
  • @siddhesh,当然,请参阅有问题的更新。谢谢

标签: php arrays sorting multidimensional-array


【解决方案1】:

您可以通过 php 内置函数 usort() 获得所需的结果。这是由 @mark baker 建议的 在此之前您必须清楚地了解该功能 所以一些关于 usort 的解释

语法:

usort($unsorted_array,callbakc_function)

回调函数将有两个参数,它们是未排序数组的连续元素。 例如,第一次它将在第二个 (1,2) 时为 (0,1),依此类推,函数应根据以下条件返回 0,1 或 -1

  1. 如果您在特定条件下对两个元素的比较相等 然后 0

  2. 如果您在特定条件下对两个元素的比较小于 -1

  3. 如果您在特定条件下对两个元素的比较相等,则为 1

和 php 将根据这个返回值对数组进行排序,例如如果您的函数为元素索引 0,1 返回 1,那么它将交换两个元素。最后您的数组将使用自定义条件进行排序。

注意:回调函数的第一个参数将是 array 和 second 将是该实例的当前值。例如在 比较(0,1)索引第一个参数将是array1,第二个将是 数组[0]。

现在让我们看看您的问题,如果您在此处使用 usort,您将在函数中获取每个玩家数组,然后您必须计算位于第 3 个索引元素的每个玩家得分的总和,并比较两个总和并返回适当的整数值。 所以你应该像这样编写这个问题

sort($Allplayers,"cmp");
function cmp($a,$b)
{
    $total1 =array_sum($a[3]); 

    $total2 =array_sum($b[3]); 
    if($total1 == $total2)
        return 0;
    return ($total1 > $total2)? -1 :1;
}

参考:usort() 来自 php 文档。

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2023-03-18
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多