Сортировка текстовых данных по числовому значению - PullRequest
2 голосов
/ 12 июля 2011

У меня есть форма фэнтези-футбола, которая создает данные во внешнем текстовом файле, и у меня все работает, я столкнулся с одной проблемой.Может кто-нибудь показать мне, как я могу отсортировать игроков по их количеству (наибольшее сверху), а затем выделить (красным цветом) весь ряд игроков, набравших наибольшее количество очков?

Вот мой файл формы:

<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>

<title>Fantasy Football</title>
</head>
<body>
<form action="team.php" method="POST">
<table border="1">
<tr><td>Player Name</td><td><input type="text" name="name"</td></tr>
<tr><td>Position</td><td><input type="text" name="position"</td></tr>
<tr><td>Number</td><td><input type="text" name="number"</td></tr>
<tr><td>Team</td><td><input type="text" name="team"</td></tr>
<tr><td>Points per game</td><td><input type="text" name="points"</td></tr>
<tr><td colspan="2" align="center"><input type="submit"></td></tr>
</table>
</form>
</body>
</html>

А вот и возвращаемые данные:

<?php
$name = $_POST['name'];
$team = $_POST['team'];
$number = $_POST['number'];
$position = $_POST['position'];
$points = $_POST['points'];
$DOC_ROOT = $_SERVER['DOCUMENT_ROOT'];

@ $fp = fopen("$DOC_ROOT/../php/football.txt","ab");

if(!$fp) {
echo 'Error: Cannot open file.';
exit;
} 

fwrite($fp, $name."|".$team."|".$number."|".$position."|".$points."\n");
?>

<?php
$DOC_ROOT = $_SERVER['DOCUMENT_ROOT'];
$players = file("$DOC_ROOT/../php/football.txt");
echo "<table border='2'>";
echo "<tr> <td>Name</td> <td>Team</td> <td>number</td> <td>Position</td> <td>Points</td> </tr>";
for($i = 0; $i < sizeof($players); $i++) {
list($name,$team,$number,$position,$points) = explode('|', $players[$i]);
 echo '<tr><td>'.$name.'</td><td>'.$team.'</td><td>'.$number.'</td>
 <td>'.$position.'</td><td>'.$points.'</td></tr>';
 }
 echo '</table>';
 ?>

Не очень хорошо вставлять кусочки кода, так что еслиВы могли бы, вы можете сказать мне точно, куда положить то, что вы можете дать мне?

Обновление:

Это где мне нужно было все положить?Как сейчас, когда я отправляю форму, я ничего не вижу!Очевидно, я сделал что-то не так, поэтому я открыт для предложений!

    <?php
function sort_player_array( $array, $key, $asc = true) {
$result = array();

$values = array();
foreach ($array as $id => $value) {
    $values[$id] = isset($value[$key]) ? $value[$key] : '';
}

if ($asc) {
    asort($values);
}
else {
arsort($values);
}

foreach ($values as $key => $value) {
    $result[$key] = $array[$key];
}

return $result;
}
?>
<?php
$name = $_POST['name'];
$team = $_POST['team'];
$number = $_POST['number'];
$position = $_POST['position'];
$points = $_POST['points'];
$DOC_ROOT = $_SERVER['DOCUMENT_ROOT'];

@ $fp = fopen("$DOC_ROOT/../php/football.txt","ab");

if(!$fp) {
echo 'Error: Cannot open file.';
exit;
}
?>
<?php
fwrite($fp, $name."|".$team."|".$number."|".$position."|".$points."\n");

$players = file("$DOC_ROOT/../php/football.txt");
$player_array = array();

foreach($players AS $player)
{
list($name,$team,$number,$position,$points) = explode('|', $players[$i]);
$player_array[] = array('name'     => $name,
                        'number'   => $number,
                        'position' => $position,
                        'points'   => $points,
);
}

$sorted_players = sort_player_array($player_array, 'number', true);

foreach( $sorted_players AS $player )
{
echo '<tr><td>'.$player[name].'</td><td>'.$player[team].'</td><td>'
.$player[number].'</td><td>'.$player[position].'</td><td>'.$player[points].'</td></tr>';
} ?>

Ответы [ 4 ]

1 голос
/ 12 июля 2011

Прежде всего вы программируете на PHP, используйте COUNT () вместо SIZEOF (). sizeof () является псевдонимом count () и может быть удален по мере развития php.

Нам нужна функция для сортировки массива:

function sort_player_array( $array, $key, $asc = true) {
    $result = array();

    $values = array();
    foreach ($array as $id => $value) {
        $values[$id] = isset($value[$key]) ? $value[$key] : '';
    }

    if ($asc) {
        asort($values);
    }
    else {
    arsort($values);
    }

    foreach ($values as $key => $value) {
        $result[$key] = $array[$key];
    }

    return $result;
}

Затем создайте массив с php, содержащим ваши данные, затем отсортируйте их.

$players = file("$DOC_ROOT/../php/football.txt");
$player_array = array();

foreach($players AS $player)
{
    list($name,$team,$number,$position,$points) = explode('|', $players[$i]);
    $player_array[] = array('name'     => $name,
                            'number'   => $number,
                            'position' => $position,
                            'points'   => $points,
    );
}

Мы сортируем массив по вашему запросу по номеру, но возможен любой ключ. также вы можете установить ASC или DESC с третьей переменной

* * 1010
0 голосов
/ 12 июля 2011

Я думаю, вы сможете создавать массивы с помощью функции списка.Примерно так:

    //set array variables
    for($i = 0; $i < sizeof($players); $i++) {
    list($name[],$team[],$number[],$position[],$points[]) = explode('|', $players[$i]);
     }
//sort all arrays by the number, in descending order
array_multisort($number, $position, $name, $team, $points, SORT_DESC);
//set the highest points to mostPoints variable
var mostPoints = max($points);
    //Output table rows
    for($i = 0; $i < sizeof($players); $i++) {
    if($points[$i]==mostPoints){
        //red background
        echo '<tr style="background:#F44">';
}else{
        echo '<tr>';
}
echo '<td>'.$name[$i].'</td><td>'.$team[$i].'</td><td>'.$number[$i].'</td><td>'.$position[$i].'</td><td>'.$points[$i].'</td></tr>';
    }

Я не проверял это, поэтому, может быть, есть несколько вещей, которые я пропустил, но это должно сработать.См. Функции Array Multisort и max .Может быть лучше назначить класс красной строке таблицы вместо стиля;таким образом вы можете изменить теги td;Я думаю, что это более дружественно к браузеру.CSS для этого был бы что-то вроде .redRow td {background:#F44}, если бы вы дали tr класс redRow.

0 голосов
/ 12 июля 2011

Подготовить массив $playerData, который содержит все записи игрока и использует их номера в качестве ключа.Затем используйте ksort () :

ksort( $playerData );

. При подготовке $playerData сохраняйте переменные $ maxPoints и $ mapPointsPlayerNumber и сверяйте данные каждого игрока с этими значениями.Обновите их, если текущая точка игрока превышает $ maxPoints.

0 голосов
/ 12 июля 2011

Похоже, вам нужна какая-то функция алгоритма сортировки для $players.Существуют различные виды, и вы можете найти их, прибегая к помощи «алгоритмов сортировки», или вы можете написать их самостоятельно, если хотите «заново изобрести колесо».Самостоятельная работа делает для хорошей практики / веселья: D

Вот ссылка на вики по пузырьковой сортировке, вероятно, самая распространенная базовая сортировка и поможет в вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...