Я играю с лигой легенд $api и асинхронными запросами, но сейчас у меня проблема, я не могу сумма всех убийств с идентификатора участника == 1
array_sum показывает только убийства из каждой игры, а не сумму всех (скриншот) ожидаемый результат должен быть 122 (сумма всех убийств участника с идентификатором 1)
это мой код:
<?php
// Function to be called on request success
$onSuccess = function (Objects\MatchDto $match) {
foreach ($match->participants as $team) {
if ($team->participantId==1 and $team->teamId==100) {
$t[]=$team->stats->kills.'</br>';
var_dump (array_sum($t)); echo '</br>';
}
}
};
// Function to be called on request failure
$onFailure = function ($ex) {
echo "Error occured: {$ex->getMessage()}";
};
//I have a bunch of match_ids from league of legends games saved in my db
// so, foreach $custom is to get all match_ids
// $api variable is an array with all initializtion settings
// $match is basically getting me the match with that matchid from my db ex: getMatch('1234567')
foreach ($custom as $games) {
$api->nextAsync($onSuccess, $onFailure);
$match=$api->getMatch($games->match_id);
}
$api->commitAsync();
?>
это то, что возвращает мне array_sum вместо ожидаемого результата 122.
я ожидаю 122 в результате, потому что это сумма всех этих чисел, и даже вне foreach отображается каждое число, а не сумма
Вы не инициализируете $t
до того, как начнете вводить в него значения. Затем вы объединяете строку с каждым значением перед добавлением ее в массив, гарантируя, что у вас есть массив строк для сложения. По правилам PHP это может работать, но я бы не стал на это полагаться.
Вы должны инициализировать $t выше/снаружи foreach и array_sum ниже foreach и удалить строку `<br>'
но я могу только инициализировать $t внутри этого foreach;
И почему так? Что такое принуждение
array_sum
работает нормально. для простоты вам это даже не нужно. простого суммирования $t = 0;
и $t += kills
должно быть достаточно.
@ Кевин, очень хороший момент, я обновляю ответ, чтобы отразить эту лучшую альтернативу.
я получаю точно такой же результат, как и раньше, я не знаю почему, но я заметил, что foreach с $custom проходит через функцию $onsucess, если я стираю все в функции $onsuccess и эхо просто " test", он выводит 33 "test", точно такое же количество совпадений, которое у меня есть в моей базе данных.
<?php
$onSuccess = function(Objects\MatchDto $match, &$t){
foreach ($match->participants as $team){
if ($team->participantId==1 and $team->teamId==100){
$t+=$team->stats->kills;
}
}
};
$onFailure = function($ex){
echo "Error occurred: {$ex->getMessage()}";
};
$t = 0;
foreach($custom as $games){
$api->nextAsync($onSuccess, $onFailure);
$match=$api->getMatch($games->match_id);
}
$api->commitAsync();
echo $t."<br>";
?>
Дайте мне знать, как это происходит для вас. Раньше я не обращал внимания, чтобы заметить, что вы также перебираете несколько совпадений (onSuccess вызывается несколько раз).
я получаю тот же результат, что и раньше, я не знаю, почему
но я заметил, что foreach с $custom проходит через функцию $onsucess, если я стираю все в функции $onsuccess и эхо просто "тест", он печатает 33 "тест", точный такое же количество совпадений, которое у меня есть в моей базе данных
Я на самом деле неправильно прочитал ваш код раньше, мои извинения. обновленный ответ скоро появится.
скоро ~= 5 часов, я думаю. но см. обновление, если все еще необходимо
Почему это ожидается? Вы суммируете и сбрасываете каждый раз, когда выполняете итерацию (это подсказка, переместите его за пределы foreach)