按列对多维关联数组进行排序,并保留第一级键。

41
我有一个看起来像这样的数组:
$this->wordswithdata = [
    'team1' => [
        'points' => 10,
        'players' => [],
    ],
    'team2' => [
        'points' => 23,
        'players' => []
    ]
];

我想按每个团队拥有的积分从高到低对团队进行排序。我尝试过这样做:

function sort_by_points($a,$b)
{
    if ($a['points'] == $b['points']) return 0;
        return ($a['points'] < $b['points']) ? 1 : -1;
}

usort($this->wordswithdata, "sortbycount");

但这种方法会覆盖包含团队名称的键,并返回:

[
    0 => [
        'points' => 23,
        'players' => []
    ],
    1 => [
        'points' => 10,
        'players' => [],
    ]
]

有没有办法在不失去团队名称作为数组键的情况下对数组进行排序?

6个回答

41
使用uasort函数,这应该会保持键=>值的关联完整性。
(副注:你可以使用return $a['points'] - $b['points']代替ifs,或者在php7中使用spaceship <=>运算符,感谢mbomb007的更新)

1
从 PHP 7 开始,你可以使用宇宙飞船操作符 <=> 代替减法。请参考此相关问题的答案 - mbomb007

28

你可以使用uasort函数:

uasort($array, function($a, $b) {
    return $a['points'] - $b['points'];
});

这个函数按照用户定义的比较函数来排序一个数组,以使数组索引与它们关联的数组元素保持一致


2
为了完整起见,此页面应包括使用array_multisort()的方法--此函数默认情况下将保留非数字键。
代码:(演示)
array_multisort(
    array_column($array, 'points'),
    SORT_DESC,
    $array
);

话虽如此,使用太空船操作符调用uasort()是没有问题的。请注意,三向比较运算符的左侧是$b数据,右侧是$a以实现降序排序。

代码:演示

uasort(
    $array,
    fn($a, $b) => $b['points'] <=> $a['points']
);

2
您可以像这样按值对关联数组进行排序。
$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");

function Ascending($a, $b) {   
    if ($a == $b) {        
        return 0;
    }   
        return ($a < $b) ? -1 : 1; 
}  

function Descending($a, $b) {   
    if ($a == $b) {        
        return 0;
    }   
        return ($a > $b) ? -1 : 1; 
}  


echo "Ascending order" ;
uasort($age,"Ascending");
print_r($age);


echo "</br>Descending order" ;
uasort($age,"Descending");
print_r($age);

0
its working fine i giving example
that array need sort
$sumarray=array [▼
  484 => 54.7875
  486 => 53.5375
  487 => 52.9125
  488 => 52.2875
  493 => 54.7875
]

$original=$sumarray;

 $svalue=array_values($sumarray);
  rsort($svalue);
  $sorted=array();
  foreach ($svalue as $key => $value) {
   $kk=array_search($value,$sumarray);
  $sorted[$kk]=$value;
  unset($sumarray[$kk]);

    }
  print_r($original);
    print_r($svalue);
  print_r($sorted);
             //out put
  array:5 [▼
  484 => 54.7875
  486 => 53.5375
  487 => 52.9125
  488 => 52.2875
  493 => 54.7875
]
array:5 [▼
  0 => 54.7875
  1 => 54.7875
  2 => 53.5375
  3 => 52.9125
  4 => 52.2875
]
array:5 [▼
  484 => 54.7875
  493 => 54.7875
  486 => 53.5375
  487 => 52.9125
  488 => 52.2875
]

感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。一个适当的解释将极大地提高其长期价值,因为它可以展示为什么这是一个好的问题解决方案,并使其对未来读者有其他类似问题的人更有用。请[编辑]您的答案以添加一些解释,包括您所做的假设。 - Capricorn
我无法想象任何可能的情况,我会想要邀请这种间接/复杂的代码进入我的项目。除了忽略相同数据结构之外,为什么任何使用平面关联数组的人都应该调用array_values(),然后是rsort(),然后进行迭代调用array_search()unset()呢? - mickmackusa

0

尝试这段代码,希望它能正常工作。

function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"points");

我没有看到任何令人信服的理由让任何人使用这种未经解释和间接的答案。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接