TemKa_SD 9 11/01/18 12:25 (изменено) Здравствуйте. У в функции выбираются последние игры игрока, есть два типа игроков dotaPlayer и w3mmdPlayer. /** * STEP 2: Selet Game */ $steps['sharedstats_report_select_game'] = function ($data) use ($names) { $games = $gameIds = []; $i = 0; $acc = isset($data['account']) ? $data['account'] : $names[0]; foreach ((\IPS\DB::i('stats')->select('*', 'stats_gameplayers', array('name=?', $acc['name']), 'id DESC', \IPS\Settings::i()->report_max_last_games)) as $gameplayer) { try { $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first(); $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); $hero = mb_strtoupper($dotaPlayer['hero']); $gameIds[$i] = $game['id']; $games[] = $game['gamename'] /*"<br> <div class='gc_u_flex_row'><span class='hero hero-${hero} hero--small hero--round'></span> <strong>K/D/A:</strong> <span style='color: #0F0;'>${dotaPlayer['kills']}</span>/<span style='color: #00F;'>${dotaPlayer['assists']}</span>/<span style='color: #F00;'>${dotaPlayer['deaths']}</span> <strong>C/D/N:</strong> <span>${dotaPlayer['creepkills']}</span>/<span>${dotaPlayer['creepdenies']}</span>/<span>${dotaPlayer['neutralkills']}</span></div> "*/; } catch(\UnderflowException $e) {} ++$i; } $form = new \IPS\Helpers\Form('', 'continue'); $form->addHeader('sharedstats_report_select_game'); $form->add(new \IPS\Helpers\Form\Radio('sharedstats_report_select_recent_game', null, true, array('options' => $games))); if ($values = $form->values()) { $data['gameid'] = $gameIds[$values['sharedstats_report_select_recent_game']]; return $data; } return $form; }; Изначально код имеет вид без строк, так как заточено под доту, мне нужно вывести игры второго типа игрока. $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); Игры не отображаются, если убрать $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); то всё в порядке. Изменено 1 ноября 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 11/01/18 12:31 Вроде понял, нужно в catch добавить условие для второго типа игроков. Правильно? Поделиться сообщением Ссылка на сообщение
newbie 1723 11/01/18 12:40 Я же уже писал про first() и try/catch Если у Вас есть try { $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first(); $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); } catch(\UnderflowException $e) {}и в $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first();будет выброшено исключение, то ниже идущий код не выполнитсяТо же справедливо для других выборок Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 11/01/18 12:42 Я думал об этом, но изначальный код имеет вид: try { $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first(); $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); } catch(\UnderflowException $e) {} И всё работает, первая и вторая переменная выбирают результаты. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 11/01/18 13:52 Правильно? foreach ((\IPS\DB::i('stats')->select('*', 'stats_gameplayers', array('name=?', $acc['name']), 'id DESC', \IPS\Settings::i()->report_max_last_games)) as $gameplayer) { try { $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first(); try { $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); $hero = mb_strtoupper($dotaPlayer['hero']); $gameIds[$i] = $game['id']; $games[] = $game['gamename'] . "<br> <div class='gc_u_flex_row'><span class='hero hero-${hero} hero--small hero--round'></span> <strong>K/D/A:</strong> <span style='color: #0F0;'>${dotaPlayer['kills']}</span>/<span style='color: #00F;'>${dotaPlayer['assists']}</span>/<span style='color: #F00;'>${dotaPlayer['deaths']}</span> <strong>C/D/N:</strong> <span>${dotaPlayer['creepkills']}</span>/<span>${dotaPlayer['creepdenies']}</span>/<span>${dotaPlayer['neutralkills']}</span></div> "; } catch(\UnderflowException $e) {} try { $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); $gameIds[$i] = $game['id']; $games[] = $game['gamename']; } catch(\UnderflowException $e) {} } catch(\UnderflowException $e) {} ++$i; } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 11/01/18 14:11 Ну да, всё отлично. Я понял примерно, в catch можно еще ошибку выводить или другие какие-нибудт данные, когда try не срабатывает. Помогите еще вывести иконку героя. У меня есть готовые функции, которые выполняют это, их надо просто внедрить сюда. Собирает все данные, которые, передает карта в БД: protected function collectPlayerVars($gameId) { $playerVars = \IPS\DB::i('stats')->select('*', ['stats_w3mmdvars', 'w3v'], array('w3v.gameid=?', $gameId)); return $playerVars; } Собирает выше упомянутые данные с игроком: protected function mergePlayerVars($players, $vars) { $p = []; foreach($players as $player) { $v = []; foreach($vars as $var) { if($player['pid'] === $var['pid']) { $varName = $var['varname']; if($varName !== 'name') { $v[$varName] = intval($var['value_int']); } else { $v['name'] = $var['value_string']; } } } $winner = $player['flag'] === 'winner'; if($winner) { $this->hasWinner = true; } $p[$player['pid']] = [ 'name' => $player['name'], 'team' => $player['team'], 'ip' => $player['ip'], 'left' => intval($player['left']), 'leftreason' => $player['leftreason'], 'colour' => intval($player['colour']), 'server' => $player['spoofedrealm'], 'winner' => $winner, 'looser' => !$winner, 'leaver' => intval($player['leaver']), 'vars' => $v, 'scoreId' => isset($player['scoreId']) ? $player['scoreId'] : 0 ]; } return $p; }Сюда нужно вставить результат: try { $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first(); $playerVars = $this->collectPlayerVars($game['id']); $mergedPlayerVars = $this->mergePlayerVars($w3mmdPlayer, $playerVars); $hero = $mergedPlayerVars; $gameIds[$i] = $game['id']; $games[] = $game['gamename'] . "<br> ${hero} "; } catch(\UnderflowException $e) {} Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 11/01/18 14:15 Сейчас такая ошибка: Whoops\Exception\ErrorException: Illegal string offset 'pid' (2) Поделиться сообщением Ссылка на сообщение
newbie 1723 11/02/18 06:07 Сейчас такая ошибка: Whoops\Exception\ErrorException: Illegal string offset 'pid' (2) Используйте isset()if isset($var['pid']) Поделиться сообщением Ссылка на сообщение