php 对多维数组进行排序,但索引从 1 开始
php Sort multidimensional array but start index at 1
我有一个多维数组,我想根据 'rating'... 进行排序,但我也希望索引从 1 开始,这是我在手动创建这些时使用的。当我使用 usort 时,它会重新排列数组,但现在它们从索引 0 开始,所以我不能从 1 - 6 进行循环,因为 6 在排序后未定义。
我的 $array 从 1 开始更清晰,所以 $player[$i] 代表了实际的玩家编号。这是我的数组在 sort
之前的样子
$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');
最简单的方法是在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
)
只需在您的排序后添加以下内容:
$player = array_combine(range(1, count($player)), $player);
uasort()
可用于使数组保留原始键:
uasort($player, function ($x, $y) {
return $x['rating'] - $y['rating'];
});
我有一个多维数组,我想根据 'rating'... 进行排序,但我也希望索引从 1 开始,这是我在手动创建这些时使用的。当我使用 usort 时,它会重新排列数组,但现在它们从索引 0 开始,所以我不能从 1 - 6 进行循环,因为 6 在排序后未定义。
我的 $array 从 1 开始更清晰,所以 $player[$i] 代表了实际的玩家编号。这是我的数组在 sort
之前的样子$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');
最简单的方法是在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
)
只需在您的排序后添加以下内容:
$player = array_combine(range(1, count($player)), $player);
uasort()
可用于使数组保留原始键:
uasort($player, function ($x, $y) {
return $x['rating'] - $y['rating'];
});