Чтение и запись текстового файла с результатами турнирных матчей с помощью PHP

Группа G Лиги чемпионов результаты футбольных соревнований:

РБ Лейпциг;Монако;ничья
ФК Порту; Бешикташ ЮК; поражение
Бешикташ ЮК; РБ Лейпциг; победа
AS Monaco;FC Porto;поражение
AS Monaco; Besiktas JK; поражение
РБ Лейпциг;Порту;победа
Бешикташ ЙК;Монако;ничья
«Порту»; «РБ Лейпциг»; победа
Бешикташ ЮК;Порту;ничья
«Монако»; «РБ Лейпциг»; поражение
«Порту»; «Монако»; победа
РБ Лейпциг; Бешикташ ЮК; поражение

  1. Результат матча относится к первой команде в списке.

    (Примеры:
    Бешикташ ЮК; РБ Лейпциг; победа

    • означает, что «Бешикташ» обыграл «РБ Лейпциг».

    AS Monaco FC;Besiktas JK;поражение

    • означает, что «Бешикташ» обыграл «Монако».

    РБ Лейпциг; ФК Монако; ничья

    • означает, что «РБ Лейпциг» и «Монако» сыграли вничью.)
  2. Победа приносит команде 3 очка. Ничья приносит 1. Проигрыш приносит 0.

  3. Результат должен быть упорядочен по пунктам, по убыванию. В случае ничьей команды располагаются в алфавитном порядке.

Вывод должен получиться таким:

Team                           | MP |  W |  D |  L |  P
Besiktas JK                    |  6 |  4 |  2 |  0 |  14
FC Porto                       |  6 |  3 |  1 |  2 |  10
RB Leipzig                     |  6 |  2 |  1 |  3 |  6
AS Monaco                      |  6 |  0 |  2 |  4 |  2

Однако я не могу получить результаты с точки зрения рейтинга и побед на выезде. Как я могу это сделать?

#tournament.txt

RB Leipzig;AS Monaco;draw
FC Porto;Besiktas JK;loss
Besiktas JK;RB Leipzig;win
AS Monaco;FC Porto;loss
AS Monaco;Besiktas JK;loss
RB Leipzig;FC Porto;win
Besiktas JK;AS Monaco;draw
FC Porto;RB Leipzig;win
Besiktas JK;FC Porto;draw
AS Monaco;RB Leipzig;loss
FC Porto;AS Monaco;win
RB Leipzig;Besiktas JK;loss
#tournament.php

<?php

$lines = file('tournament.txt');

foreach ($lines as $line) {
    
    $parts = explode(';', $line);
    
    $teams[$parts[0]][] = $parts[2];
    $teams[$parts[1]][] = $parts[2];
}


uksort($teams, function ($a, $b) use ($teams) {
    $aPoints = 0;
    $bPoints = 0;
    foreach ($teams[$a] as $result) {
        if ($result == 'win') {
            $aPoints += 3;
        } elseif ($result == 'draw') {
            $aPoints += 1;
        }
    }
    foreach ($teams[$b] as $result) {
        if ($result == 'win') {
            $bPoints += 3;
        } elseif ($result == 'draw') {
            $bPoints += 1;
        }
    }
    foreach ($teams[$a] as $result) {
        if ($result == 'loss') {
            $aPoints += 0;
            $bPoints += 3;
        }
    }
    foreach ($teams[$b] as $result) {
        if ($result == 'loss') {
            $aPoints += 3;
            $bPoints += 0;
        }
    }
    if ($aPoints == $bPoints) {
        return $a <=> $b;
    }
    return $bPoints <=> $aPoints;
});

$fp = fopen('tournament.txt', 'w');
fwrite($fp, "Team                          | MP |  W |  D |  L |  P

");
foreach ($teams as $team => $results) {
    $mp = count($results);
    $w = 0;
    $d = 0;
    $l = 0;
    foreach ($results as $result) {
        if ($result == 'win') {
            $w++;
        } elseif ($result == 'draw') {
            $d++;
        } else {
            $l++;
        }
    }
    $p = $w * 3 + $d;
    fwrite($fp, sprintf("%-30s| %2d | %2d | %2d | %2d | %2d

", $team, $mp, $w, $d, $l, $p));
}

fclose($fp);

?>

И тот код, который вы показываете...? Что дает...? В чем проблема..?

Juan 10.10.2022 14:09

Почему вы используете текстовый файл, когда база данных сделала бы все это намного проще?

Martin 10.10.2022 15:42

Пробовал работать с текстовым файлом. Да, я согласен: база данных сделает это намного проще. Тем не менее, мне пришлось попробовать. @Мартин

kalawaja 10.10.2022 21:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не могу проверить ваш код, потому что у меня версия PHP 5.6.36. Но с приведенным ниже кодом, который работает с PHP 5, я получаю результаты. В том числе и на выезде.

<style type = "text/css">
table       { border-spacing: 0px; }
table th    { padding: 5px; border: 1px solid black; }
table td    { padding: 3px; border: 1px solid dimgrey; }
</style>


<?
// Initialisation
$infoList = array("MP","W","Wext","D","L","P");

// Open File
$lines = file('tournament.txt');

// For Each Line
foreach ($lines as $line)
{
  $parts = explode(';', $line);
  
  // Extraction
  $teamA    = $parts[0];
  $teamB    = $parts[1];
  $score    = $parts[2];

  // Initialization
  $teamList["$teamA"]["W"]      = 0;
  $teamList["$teamA"]["Wext"] = 0;
  $teamList["$teamA"]["L"]      = 0;
  $teamList["$teamA"]["D"]      = 0;
  $teamList["$teamA"]["P"]      = 0;
  $teamList["$teamA"]["MP"]     = (array_key_exists("MP", $teamList["$teamA"]))?bcadd($teamList["$teamA"]["MP"],1,0):1;

  // Initialization
  $teamList["$teamB"]["W"]      = 0;
  $teamList["$teamB"]["Wext"] = 0;
  $teamList["$teamB"]["L"]      = 0;
  $teamList["$teamB"]["D"]      = 0;
  $teamList["$teamB"]["P"]      = 0;
  $teamList["$teamB"]["MP"]     = (array_key_exists("MP", $teamList["$teamB"]))?bcadd($teamList["$teamB"]["MP"],1,0):1;

  // Memorisation
  $matchList[] = array("teamA"=>$teamA, "teamB"=>$teamB, "score"=>trim($score));
}
// End - For Each Line



// For Each Match
foreach($matchList as $matchKey => $matchValue)
{
    // If Team A Win
    if ($matchValue["score"]= = "win")
    {
        // Memorisation Team A
        $teamList["".$matchValue["teamA"].""]["W"]  = bcadd($teamList["".$matchValue["teamA"].""]["W"],1,0);
        $teamList["".$matchValue["teamA"].""]["P"]  = bcadd($teamList["".$matchValue["teamA"].""]["P"],3,0);
    }


    // If Team A Loss
    if ($matchValue["score"]= = "loss")
    {
        // Memorisation Team B
        $teamList["".$matchValue["teamB"].""]["W"]      = bcadd($teamList["".$matchValue["teamB"].""]["W"],1,0);
        $teamList["".$matchValue["teamB"].""]["Wext"] = bcadd($teamList["".$matchValue["teamB"].""]["Wext"],1,0);
        $teamList["".$matchValue["teamB"].""]["P"]      = bcadd($teamList["".$matchValue["teamB"].""]["P"],3,0);
    }


    // If Equality
    if ($matchValue["score"]= = "draw")
    {
        // Memorisation Team A
        $teamList["".$matchValue["teamA"].""]["D"]  = bcadd($teamList["".$matchValue["teamA"].""]["D"],1,0);
        $teamList["".$matchValue["teamA"].""]["P"]  = bcadd($teamList["".$matchValue["teamA"].""]["P"],1,0);

        // Memorisation Team B
        $teamList["".$matchValue["teamB"].""]["D"]  = bcadd($teamList["".$matchValue["teamB"].""]["D"],1,0);
        $teamList["".$matchValue["teamB"].""]["P"]  = bcadd($teamList["".$matchValue["teamB"].""]["P"],1,0);
    }
}
// Fin - For Each Match










// -------- Display in HTML -------- //

echo "<table>";
echo "<tr>";
echo "<th></th>";
foreach($infoList as $infoKey => $infoValue)    { echo "<th>".$infoValue."</th>"; }
echo "</tr>";


// For Each Team
foreach($teamList as $teamName => $teamValue)
{
    echo "<tr>";
    echo "<td>".$teamName."</td>";

    // For Each Type Information
    foreach($infoList as $infoKey => $infoValue)
    {
        echo "<td>".$teamValue["$infoValue"]."</td>";
    }
    // End - For Each Type Information

    echo "</tr>";
}
// End - For Each Team

echo "</table>";

// --------------------------------- //
?>

Это может показаться немного громоздким, но позволяет иметь массив teamList со всей необходимой информацией.

Вы действительно должны перестать помогать другим, прежде чем помогать себе, используя PHP 7.4 или более позднюю версию. PHP 5 КОНЕЦ ЖИЗНИ почти 4 года назад!!! Обновлять!!!

Martin 10.10.2022 15:40

Я не являюсь администратором сети, в которой я разрабатываю. Дома я на PHP 7.X. Но меня нет дома, и я воспользовался перерывом на работе, чтобы попытаться кому-то помочь. С той сетью, в которой я нахожусь и которую не администрирую.

Juan 10.10.2022 15:49

Другие вопросы по теме