2012-01-30 4 views
0

Борьба с этим алгоритмом турниров.Светильники PHP алгоритм

код работает отлично, но мне нужна помощь вставки данных в MySQL я не могу показаться, чтобы получить доступ к $ varables ..

либо настройки с помощью PHP про высоко оценен ...

$teamnames = "Arsenal|Tottenham|Leeds|Man United|Liverpool"; 



     # XXX check for int 
     print show_fixtures(isset($_GET['teams']) ? nums(intval($_GET['teams'])) : explode("|", trim($teamnames))); 


function nums($n) { 
    $ns = array(); 
    for ($i = 1; $i <= $n; $i++) { 
     $ns[] = $i; 
    } 
    return $ns; 
} 

function show_fixtures($names) { 
    $teams = sizeof($names); 

    print "<p>Fixtures for $teams teams.</p>"; 

    // If odd number of teams add a "ghost". 
    $ghost = false; 
    if ($teams % 2 == 1) { 
     $teams++; 
     $ghost = true; 
    } 

    // Generate the fixtures using the cyclic algorithm. 
    $totalRounds = $teams - 1; 
    $matchesPerRound = $teams/2; 
    $rounds = array(); 
    for ($i = 0; $i < $totalRounds; $i++) { 
     $rounds[$i] = array(); 
    } 

    for ($round = 0; $round < $totalRounds; $round++) { 
     for ($match = 0; $match < $matchesPerRound; $match++) { 
      $home = ($round + $match) % ($teams - 1); 
      $away = ($teams - 1 - $match + $round) % ($teams - 1); 
      // Last team stays in the same place while the others 
      // rotate around it. 
      if ($match == 0) { 
       $away = $teams - 1; 
      } 
      $rounds[$round][$match] = team_name($home + 1, $names) 
       . " v " . team_name($away + 1, $names); 


     } 
    } 

    // Interleave so that home and away games are fairly evenly dispersed. 
    $interleaved = array(); 
    for ($i = 0; $i < $totalRounds; $i++) { 
     $interleaved[$i] = array(); 
    } 

    $evn = 0; 
    $odd = ($teams/2); 
    for ($i = 0; $i < sizeof($rounds); $i++) { 
     if ($i % 2 == 0) { 
      $interleaved[$i] = $rounds[$evn++]; 
     } else { 
      $interleaved[$i] = $rounds[$odd++]; 
     } 
    } 

    $rounds = $interleaved; 

    // Last team can't be away for every game so flip them 
    // to home on odd rounds. 
    for ($round = 0; $round < sizeof($rounds); $round++) { 
     if ($round % 2 == 1) { 
      $rounds[$round][0] = flip($rounds[$round][0]); 
     } 
    } 

    // Display the fixtures   
    for ($i = 0; $i < sizeof($rounds); $i++) { 
     print "<hr><p>Round " . ($i + 1) . "</p>\n"; 
     foreach ($rounds[$i] as $r) { 


     print $r . "<br />"; 


     } 
     print "<br />"; 
    } 
    print "<hr>Second half is mirror of first half"; 
    $round_counter = sizeof($rounds) + 1; 
    for ($i = sizeof($rounds) - 1; $i >= 0; $i--) { 
     print "<hr><p>Round " . $round_counter . "</p>\n"; 
     $round_counter += 1; 
     foreach ($rounds[$i] as $r) { 
      print flip($r) . "<br />"; 
     } 
     print "<br />"; 
    } 
    print "<br />"; 

    if ($ghost) { 
     print "Matches against team " . $teams . " are byes."; 
    } 
} 

function flip($match) { 
    $components = split(' v ', $match); 


    return "$components[1]" . " v " . "$components[0]"; 

} 

function team_name($num, $names) { 
    $i = $num - 1; 
    if (sizeof($names) > $i && strlen(trim($names[$i])) > 0) { 
     return trim($names[$i]); 
    } else { 
     return "BYE"; 
    } 
} 
+1

Что именно не так с данным кодом? Что не работает? – Borealid

+0

Где он бомбит? – jbnunn

+0

Код работает Мне просто нужна помощь по вставке – Webby

ответ

2

Я не совсем уверен, на что вы вешаете (вы должны быть более конкретными в своих вопросах, как указано в FAQ), но я подозреваю, что это вопрос масштаба.

Когда вы устанавливаете переменную внутри функции, эта переменная доступна только в этой функции. Например:

function do_something() { 
    $a = 'something!'; 
} 
do_something(); 
echo $a; 

Это должно привести к PHP уведомления говорю вам, что PHP не знает, что $a находится в области видимости, что она пытается echo. Теперь, если я могу изменить этот сценарий ...

$a = ''; 
function do_something() { 
    global $a; // Lets PHP know we want to use $a from the global scope 
    $a = 'something!'; 
} 
do_something(); 
echo $a; 

Это будет работать и выход «что-то!», Потому что $a в настоящее время «определен» в объеме за пределами функции.

Вы можете прочитать больше о видимости переменных в документации PHP: http://php.net/manual/en/language.variables.scope.php

Теперь что-то еще нужно обратить внимание выводит пользовательские данные. В вашем скрипте вы берете данные прямо с $_GET и распечатываете их на странице. Почему это плохо? Кто-то может добавить какой-нибудь хороший JavaScript на вашу страницу (или что угодно) и украсть сессии пользователей. Вы должны использовать htmlspecialchars() в любое время, когда вам нужно вывести переменную. Даже если это всего лишь название команды, вы никогда не знаете, когда какая-то команда будет придерживаться ; или < или > или какой-либо другой зарезервированный символ там.

Наконец, я настоятельно рекомендую не смешивать вашу логику с вашими вычислениями. Пусть ваша программа все вычеркивает, а затем прокручивает данные для вашего вывода. Вы должны иметь возможность сохранять все данные для этого типа проблемы в симпатичном ассоциативном массиве или в каком-нибудь хитрый объект, с которым вы сталкиваетесь.

+1

PHP не JavaScript. Ваш второй пример не будет работать. Вы должны использовать 'global $ a;', чтобы сделать его global/override глобальным $ a. – Saxoier

+0

@ Saxoier, Хороший улов, спасибо. – Brad

+0

Спасибо за обновление, похоже, это была глобальная проблема .. Я не сталкивался с этим раньше .. большое спасибо! – Webby

Смежные вопросы