我有一个对象数组,这些对象是足球运动员。该数组可能包含从零到数千名球员。我想将其减少到最好的10个。我的初始尝试如下:
while (count($ArrayOfPlayers) > 10) {
$ArrayIndex = 0;
$WorstPlayerIndex = -1;
$WorstPlayerSkill = 9999999999;
foreach ($ArrayOfPlayers as $Player) {
$Skill = $Player->RatingsArray['Skill'];
if ($Skill < $WorstPlayerSkill) {
$WorstPlayerIndex = $ArrayIndex;
$WorstPlayerSkill = $Skill;
}
$ArrayIndex += 1;
}
// Found the worst player in the list, so remove him.
unset($ArrayOfPlayers[$WorstPlayerIndex]);
}
阅读了类似的帖子后,我现在意识到问题在于数组实际上没有被更改,因此 while 循环会无限继续(计算机确实会锁定)。
因此,根据其他帖子的建议,我尝试进行以下更正。
while (count($ArrayOfPlayers) > 10) {
$WorstIndexPlayer = 0;
$WorstPlayerSkill = 9999999999;
foreach ($ArrayOfPlayers as $key => &$Player) {
$Skill = $Player->RatingsArray['Skill'];
if ($Skill < $WorstPlayerSkill) {
$WorstIndexPlayer = $key;
$WorstPlayerSkill = $Skill;
}
}
// Found the worst player in the list, so remove him.
unset($ArrayOfPlayers[$WorstIndexPlayer]);
}
您可能已经注意到,我现在不明白自己在做什么,也不理解 $key 部分的作用(这只是从其他示例中复制的)。它仍然会让电脑卡住。
我该如何更正这一点,或者有没有更好的方法来实现这一点?
针对数据结构的请求,以下是仅显示 2 个玩家如何排列的转储。
Array
(
[0] => Player Object
(
[ID] => 1
[TeamID] => 1
[Name] => Joseph Dorrington
[RatingsArray] => Array
(
[Skill] => 51993
)
)
[1] => Player Object
(
[ID] => 2
[TeamID] => 1
[Name] => Oliver Tillyard
[RatingsArray] => Array
(
[Skill] => 64574
)
)