#php #logic
#php #Логические
Вопрос:
У меня есть данные, содержащие десятки людей в лигах, и я пытаюсь получить результирующий набор из 4 для каждой лиги. Если я нахожусь в топ-4, то он возвращает топ-4, но если я не нахожусь, то он должен вернуть 1-е место, а также то, что выше и ниже меня, и меня.
в настоящее время у меня есть параметр с 1-го по 4-й, который я заполняю, который затем добавляется к возвращаемому массиву. В настоящее время этот код работает, хотя, если в лиге меньше 4, это неверно, а также не работает, если я в топ-4.
Меня больше беспокоит то, что у меня большой громоздкий блок if else if, должен быть более аккуратный / лучший подход, чем то, что я сделал? Я что-то упускаю?
Входные данные:
array(35) {
[0]=>
array(11) {
["groupID"]=>
int(1)
["groupName"]=>
string(6) "A Group"
["driverID"]=>
int(1)
["screenName"]=>
string(12) "MrBlog"
["score"]=>
int(9231)
["position"]=>
float(1)
},
{
["groupID"]=>
int(1)
["groupName"]=>
string(6) "A Group"
["driverID"]=>
int(2)
["screenName"]=>
string(12) "Saxon"
["score"]=>
int(7276)
["position"]=>
float(2)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(10)
["screenName"]=>
string(12) "Anonymous"
["score"]=>
int(9897)
["position"]=>
float(1)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(17)
["screenName"]=>
string(12) "Joe"
["score"]=>
int(9777)
["position"]=>
float(2)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(7)
["screenName"]=>
string(12) "Wavey Davey"
["score"]=>
int(9564)
["position"]=>
float(3)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(29)
["screenName"]=>
string(12) "White Van Man"
["score"]=>
int(9432)
["position"]=>
float(4)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(4)
["screenName"]=>
string(12) "Dan"
["score"]=>
int(9278)
["position"]=>
float(5)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(1)
["screenName"]=>
string(12) "MrBlog"
["score"]=>
int(9231)
["position"]=>
float(6)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(24)
["screenName"]=>
string(12) "Big Dan"
["score"]=>
int(8742)
["position"]=>
float(7)
},
{
["groupID"]=>
int(4)
["groupName"]=>
string(6) "All Drivers"
["driverID"]=>
int(2)
["screenName"]=>
string(12) "Saxon"
["score"]=>
int(7276)
["position"]=>
float(8)
}
Желаемый результат:
"1": {
"members": 2,
"groupName": "A Group",
"score": [
{
"groupID": 1,
"driverID": 1,
"screenName": "MrBlog",
"score": 9231,
"position": 1
},
{
"groupID": 1,
"driverID": 2,
"screenName": "Saxon",
"score": 7276,
"position": 2
}
]
},
"4": {
"members": 7,
"groupName": "All Drivers",
"score": [
{
"groupID": 4,
"driverID": 10,
"screenName": "Anonymous",
"score": 9897,
"position": 1
},
{
"groupID": 4,
"driverID": 17,
"screenName": "Joe",
"score": 9777,
"position": 2
},
{
"groupID": 4,
"driverID": 7,
"screenName": "Wavey Davey",
"score": 9564,
"position": 3
},
{
"groupID": 4,
"driverID": 29,
"screenName": "White Van Man",
"score": 9432,
"position": 4
},
{
"groupID": 4,
"driverID": 4,
"screenName": "Dan",
"score": 9278,
"position": 5
},
{
"groupID": 4,
"driverID": 1,
"screenName": "MrBlog",
"score": 9231,
"position": 6
},
{
"groupID": 4,
"driverID": 24,
"screenName": "Big Dan",
"score": 8742,
"position": 7
},
{
"groupID": 4,
"driverID": 2,
"screenName": "Saxon",
"score": 7276,
"position": 8
}
]
}
Код:
foreach ($leagues as $aLeagueID => $aLeague) {
$return[$aLeague['groupID']]['members'] = $aLeague['position'];
// New group ID?
if ($groupID != $aLeague['groupID']) {
// get our position
if($aLeague['_driverID'] == $driverID)
$myPos = $aLeague['position'];
$return[$aLeague['groupID']]['groupName'] = $aLeague['groupName'];
$return[$aLeague['groupID']]['score'][] = $aLeague;
} else if ($groupID == $aLeague['groupID']) {
if($aLeague['_driverID'] == $driverID)
$myPos = $aLeague['position'];
if ($stop) {
$fourth = $aLeague;
$return[$aLeague['groupID']]['score'][] = $first;
$return[$aLeague['groupID']]['score'][] = $second;
$return[$aLeague['groupID']]['score'][] = $third;
$return[$aLeague['groupID']]['score'][] = $fourth;
$stop = false;
$myPos = 0;
}
// If we dont know our position yet
else if($myPos == 0 amp;amp; $aLeague['position'] <= 4) {
$second = $third;
$third = $fourth;
$fourth = $aLeague;
#$return[$aLeague['groupID']]['score'][] = $prev;
#$return[$aLeague['groupID']]['score'][] = $aLeague;
}
// IF we are in the top 4
else if($myPos <= 4 amp;amp; $aLeague['position'] <= 4) {
$second = $third;
$third = $fourth;
$fourth = $aLeague;
}
// else show first place and our position / - 1
else if($myPos >= 5) {
$stop = true;
$second = $prev;
$third = $aLeague;
}
$prev = $aLeague;
}
$groupID = $aLeague['groupID'];
}
Комментарии:
1. Пожалуйста, отредактируйте свой вопрос и добавьте пример входных данных и ожидаемого результата.
Ответ №1:
Хорошо, это то, с чем я закончил. охватывает большинство ситуаций, хотя это не самое красивое решение, надеялся на что-то более элегантное.
foreach ($leagues as $aLeagueID => $aLeague) {
$return[$aLeague['groupID']]['members'] = $aLeague['position'];
// get our position
if($aLeague['_driverID'] == $driverID amp;amp; $found == false amp;amp; $aLeague['globalUserID'] != 4999) {
$myPos = $aLeague['position'];
$found = true;
}
// New group ID / First position
if ($groupID != $aLeague['groupID']) {
$return[$aLeague['groupID']]['groupName'] = $aLeague['groupName'];
$return[$aLeague['groupID']]['score'][] = $aLeague;
$found = false;
$fisrtID = $aLeagueID;
} else if ($groupID == $aLeague['groupID']) {
// If we dont know our position yet
if($myPos == 0 amp;amp; $aLeague['position'] <= 4) {
// do nothing
}
// IF we are in the top 4
else if($myPos <= 4 amp;amp; $aLeague['position'] <= 4) {
$return[$aLeague['groupID']]['score'][] = $leagues[$fisrtID 1];
if($leagues[$fisrtID 2]['groupID'] == $groupID)
$return[$aLeague['groupID']]['score'][] = $leagues[$fisrtID 2];
if($leagues[$fisrtID 3]['groupID'] == $groupID)
$return[$aLeague['groupID']]['score'][] = $leagues[$fisrtID 3];
$myPos = 0;
}
// else show first place and our position / - 1
else if($myPos >= 5) {
// If we are at the end of the road! (last) then get the previous 2 records before us
if($leagues[$aLeagueID 1]['groupID'] != $groupID amp;amp; $leagues[$aLeagueID]['groupID'] == $groupID)
$return[$aLeague['groupID']]['score'][] = $leagues[$aLeagueID - 2];
$return[$aLeague['groupID']]['score'][] = $leagues[$aLeagueID - 1];
$return[$aLeague['groupID']]['score'][] = $aLeague;
if($leagues[$aLeagueID 1]['groupID'] == $groupID)
$return[$aLeague['groupID']]['score'][] = $leagues[$aLeagueID 1];
$myPos = 0;
}
}
// Current group ID
$groupID = $aLeague['groupID'];
}