#php #xml #if-statement
#php #xml #if-оператор
Вопрос:
Я использую PHP для вывода XML-ленты наших результатов по легкой атлетике в Стэнфорде, в этом примере мужской баскетбол. Два атрибута являются результатами обеих команд, ‘hs’ — счет хозяев, а ‘vs’ — счет гостей (например, XML-атрибуты штата Орегон против Стэнфорда: hs = «67» vs = «69»). ‘hn’ и ‘vn’ — это название домашней страницы и имя посетителя (например, ‘Стэнфорд’ или ‘Штат Орегон’). Дополнительные ‘hc’ и ‘vc’ — это родной город и город гостей, и они содержат первые 4 буквы названия города (например, Стэнфорд будет ‘stan’, а ‘Штат Орегон’ будет ‘oreg’). Примечание: поскольку Cat состоит всего из трех букв, то и ‘hc’ и ‘vc’ для Cat являются ‘cat’.
Мой вопрос в том, возможно ли отобразить «Выигрыш», если счет в Стэнфорде больше, чем у соперника, или отобразить «Проигрыш», если счет в Стэнфорде меньше, чем у соперника? Например, штат Орегон победил Стэнфорд, так как я могу отобразить «в штате Орегон — проигрыш»?
<?php
$xml = simplexml_load_file('http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml');
// Reverse chronological order
$xmlArray = array();
foreach ($xml as $event_date) $xmlArray[] = $event_date;
$xmlArray = array_reverse($xmlArray);
foreach ($xmlArray as $event_date)
{
// Only output if complete
if(!empty($event_date->event['vn']) amp;amp; !empty($event_date->event['hn']) amp;amp; !empty($event_date->event['vs']) amp;amp; !empty($event_date->event['hs']))
{
// Only show opponents' name
$name = ($event_date->event['vc'] == 'stan') ? $event_date->event['hn'] : $event_date->event['vn'];
// Output "vs" if home game or "at" if away game
$preposition = ($event_date->event['hc'] == 'stan') ? 'vs' : 'at';
echo '<li>';
echo '<h3>', $preposition, ' ', $name, '</h3>';
echo '<p><strong>', $event_date->event['vn'], ' ', $event_date->event['vs'], ' - ', $event_date->event['hn'], ' ', $event_date->event['hs'], '</strong></p>';
echo '<p>', date('F j, Y', strtotime($event_date['date'])), '</p>';
echo '</li>';
}
}
?>
Комментарии:
1. не забывайте, что в некоторых видах спорта результаты могут быть выражены в виде ничьих.
Ответ №1:
$home = ($event_date->event['hc'] == 'stan');
echo '<h3>', $preposition, ' ', $name, ' - ', ((int)$event_date->event['hs'] == (int)$event_date->event['vs'] ? "Tie" : (((int)$event_date->event['hs'] > (int)$event_date->event['vs']) ? ($home? 'Win' : 'Loss') : ($home ? 'Loss' : 'Win'))), '</h3>';
Поместите это в свой цикл foreach, и я также добавил штуковину «Ничья».
Определив переменную $home, вы могли бы заменить эти строки:
// Only show opponents' name
$name = ($event_date->event['vc'] == 'stan') ? $event_date->event['hn'] : $event_date->event['vn'];
// Output "vs" if home game or "at" if away game
$preposition = ($event_date->event['hc'] == 'stan') ? 'vs' : 'at';
с помощью этих:
// Home?
$home = ($event_date->event['hc'] == 'stan');
// Only show opponents' name
$name = $home ? $event_date->event['hn'] : $event_date->event['vn'];
// Output "vs" if home game or "at" if away game
$preposition = $home ? 'vs' : 'at';
и вам не понадобился бы $ home в коде, который я написал.
Итак, вот полный код:
<?php
$xml = simplexml_load_file('http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml');
// Reverse chronological order
$xmlArray = array();
foreach ($xml as $event_date) $xmlArray[] = $event_date;
$xmlArray = array_reverse($xmlArray);
foreach ($xmlArray as $event_date)
{
// Only output if complete
if(!empty($event_date->event['vn']) amp;amp; !empty($event_date->event['hn']) amp;amp; !empty($event_date->event['vs']) amp;amp; !empty($event_date->event['hs']))
{
// Home?
$home = ($event_date->event['hc'] == 'stan');
// Only show opponents' name
$name = $home ? $event_date->event['vn'] : $event_date->event['hn'];
// Output "vs" if home game or "at" if away game
$preposition = $home ? 'vs' : 'at';
echo '<li>';
echo '<h3>', $preposition, ' ', $name, ' - ', ((int)$event_date->event['hs'] == (int)$event_date->event['vs'] ? "Tie" : (((int)$event_date->event['hs'] > (int)$event_date->event['vs']) ? ($home? 'Win' : 'Loss') : ($home ? 'Loss' : 'Win'))), '</h3>';
echo '<p><strong>', $event_date->event['vn'], ' ', $event_date->event['vs'], ' - ', $event_date->event['hn'], ' ', $event_date->event['hs'], '</strong></p>';
echo '<p>', date('F j, Y', strtotime($event_date['date'])), '</p>';
echo '</li>';
}
}
?>
Расширенный код с «если» и дополнительными комментариями:
<?php
$xml = simplexml_load_file('http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml');
// Reverse chronological order
$xmlArray = array();
foreach ($xml as $event_date) $xmlArray[] = $event_date;
$xmlArray = array_reverse($xmlArray);
foreach ($xmlArray as $event_date)
{
// Only output if complete
if(!empty($event_date->event['vn']) amp;amp; !empty($event_date->event['hn']) amp;amp; !empty($event_date->event['vs']) amp;amp; !empty($event_date->event['hs']))
{
// Home?
$home = ($event_date->event['hc'] == 'stan');
// Only show opponents' name
$name = $home ? $event_date->event['vn'] : $event_date->event['hn'];
// Output "vs" if home game or "at" if away game
$preposition = $home ? 'vs' : 'at';
if((int)$event_date->event['hs'] == (int)$event_date->event['vs']) // Tie?
{
$result = 'Tie'; // Tie
}
else if((int)$event_date->event['hs'] > (int)$event_date->event['vs']) // Home team won?
{
if($home) // Home?
{
$result = 'Win'; // You're home and the home team won
}
else
{
$result = 'Loss'; // You're away, but the home team won
}
}
else // Home team lost
{
if($home) // Home?
{
$result = 'Loss'; // You're away, but the home team won
}
else
{
$result = 'Win'; // You're home and the home team won
}
}
echo '<li>';
echo '<h3>', $preposition, ' ', $name, ' - ', $result, '</h3>';
echo '<p><strong>', $event_date->event['vn'], ' ', $event_date->event['vs'], ' - ', $event_date->event['hn'], ' ', $event_date->event['hs'], '</strong></p>';
echo '<p>', date('F j, Y', strtotime($event_date['date'])), '</p>';
echo '</li>';
}
}
?>
Комментарии:
1. Вам не нужны два места, которые повторяют «Выигрыш» или «Проигрыш».
2. Я этого не делаю, это приводит только к одному «Выигрышу» или «проигрышу» (или «Ничьей»)
3. @Tyilo: Я имею в виду это —
? ($home? 'Win': 'Loss'): ($home? 'Loss': 'Win'))
4. @Tylio вау, спасибо за все ваши усилия! Когда я запускаю ваш код, возникает пара проблем: 1. Все значения h3 изменяются на «Стэнфорд», когда они должны быть названием команды соперника (как в URL моей страницы); 2. Выигрыш / проигрыш определяется командой хозяев, когда это должно основываться на ее отношении к Стэнфорду, т. Е. если у Стэнфорда больше очков, то это означает «Победа», если у Стэнфорда меньше очков, то это означает «Проигрыш». Если вы можете это сделать, я был бы вам очень признателен!
5. @jnpcl Он сопоставляет, находитесь вы на выезде или дома, и выигрывает или проигрывает домашняя команда.
Ответ №2:
Предполагается, что $event_date->event['hs']
это счет хозяев и $event_date->event['vs']
это счет против:
echo ($event_date->event['hs'] > $event_date->event['vs']) ? 'WIN' : 'LOSS';
Или, если есть вероятность игры вничью:
echo ($event_date->event['hs'] > $event_date->event['vs']) ? 'WIN' : ($event_date->event['hs'] < $event_date->event['vs']) ? 'LOSS' : 'TIE';
Примечание: Результат этого ответа полностью основан на команде хозяев поля. Поскольку вам нужно, чтобы это всегда было связано со Стэнфордом, ответ @Tyilo лучше подходит.
Комментарии:
1. Я думаю, вы хотели сказать, что «vs» — это счет против в вашем вступительном предложении.
2. @Dave: Спасибо. Еще одна ошибка с копипастом. 😮
3. @jnpcl спасибо за ваш ответ. Когда я пробую ваш код, он отображает «ПРОИГРЫШ» для всех результатов. Если результат Стэнфорда больше, чем у соперника, должно выводиться «Победа», если Стэнфорд набрал меньше, должно быть «Проигрыш». Есть идеи, что происходит?
4. @Ryan: Каковы значения для
$event_date->event['hs']
и$event_date->event['vs']
?5. @jnpcl ‘hs’ — счет хозяев, а ‘vs’ — счет посетителей. Я отредактировал свой вопрос, чтобы прояснить это. Итак, Стэнфорд может быть хозяином или гостем, важно то, набрали ли они больше очков, чем соперник (который также может быть хозяином или гостем).