【问题标题】:php Sort multidimensional array but start index at 1 [duplicate]php对多维数组进行排序,但从1开始索引[重复]
【发布时间】:2017-10-14 22:40:28
【问题描述】:

我有一个多维数组,我想根据“评级”进行排序......但我也希望索引从 1 开始,这是我在手动创建这些数组时使用的。当我使用 usort 时,它会重新排列数组,但现在它们从索引 0 开始,所以我不能从 1 - 6 循环,因为 6 在排序后未定义。

我的 $array 从 1 开始更简洁,所以 $player[$i] 代表实际的玩家编号。这是我的数组在排序之前的样子

$player[1]['rating'] = 8
$player[2]['rating'] = 5
$player[3]['rating'] = 10

这是我的排序功能:

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

我叫它

usort($player, 'sortByRating');

【问题讨论】:

  • “玩家编号”意味着应该保留一个关联? IE。拥有密钥1 的人在排序后仍应拥有密钥1,但该密钥可能在其他地方排序?在这种情况下,您应该使用uasort。 – 否则,如果1 仅用于输出“1.”,则此处应向后弯腰;数组是零索引的,句号,在需要时添加+ 1 用于视觉输出。
  • 可能应该只使用 foreach() 循环或从 0 开始 for() 循环。

标签: php arrays sorting multidimensional-array usort


【解决方案1】:

最简单的方法是在usort后面加上这段代码:

array_unshift($player,'temp');
unset($player[0]);

完整代码:

function sortByrating($a, $b) {
    return $a['rating'] - $b['rating'];
}

$player[1]['rating'] = 8;
$player[2]['rating'] = 5;
$player[3]['rating'] = 10;

usort($player, 'sortByRating');

array_unshift($player,'temp');
unset($player[0]);

print_r($player);

输出:

Array
(
    [1] => Array
        (
            [rating] => 5
        )

    [2] => Array
        (
            [rating] => 8
        )

    [3] => Array
        (
            [rating] => 10
        )

)

更新可能的解决方案:

function sortByrating($a, $b) {
    return $a['rating'] - $b['rating'];
}

$player[1]['rating'] = 8;
$player[2]['rating'] = 5;
$player[3]['rating'] = 10;

uasort($player, 'sortByRating');

foreach($player as $player_id=>$player_data) {
    $place++;
    $player[$player_id]['place'] = $place;
    $places[$place] = $player_id;
    echo "Player #{$player_id} takes Place #{$place}\n";
}

echo "\nPlayers array: ";
print_r($player);

echo "\nPlaces array: ";
print_r($places);

输出:

Player #2 takes Place #1
Player #1 takes Place #2
Player #3 takes Place #3

Players array: Array
(
    [2] => Array
        (
            [rating] => 5
            [place] => 1
        )

    [1] => Array
        (
            [rating] => 8
            [place] => 2
        )

    [3] => Array
        (
            [rating] => 10
            [place] => 3
        )

)

Places array: Array
(
    [1] => 2
    [2] => 1
    [3] => 3
)

【讨论】:

  • 我尝试了 array_unshit 然后取消设置,这确实解决了问题。好,易于。谢谢
  • @Chief,请不要忘记在收到解决您问题的答案时标记最佳答案。
  • 如果您使用的是PHP7+,您可以使用Spaceship Operator将比较代码返回语句简化为return $a['rating'] &lt;=&gt; $b['rating'];
  • 我相信 uasort 的工作原理是一样的,在您排序后不需要这两行,因为它保留了我相信的索引。
  • @Chief, uasort 将返回 Array(2=>5, 1=>8, 3=>10)... 它只是重新排列数组行的位置,技术上它会返回相同的数组...
【解决方案2】:

只需在您的排序后添加以下内容:

$player = array_combine(range(1, count($player)), $player);

uasort() 可以用来使数组保留原始键:

uasort($player, function ($x, $y) { 
    return $x['rating'] - $y['rating']; 
});

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 2012-04-23
    • 2019-07-05
    • 2015-11-02
    • 2015-08-27
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多