Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Acessar valores de array - fetchAll()

Boa noite! Estou criando um sistema de abastecimento para treinar o aprendizado, porém me deparei com um problema e não estou conseguindo pensar em uma maneira de resolvê-lo. Eu busco no banco de dados os odômetros cadastrados na hora do abastecimento e retorno assim:

$statement->execute();
        $lista = $statement->fetchAll();
        return $lista;

Quero pegar esse array e calcular o km rodado. Então, para isso, tenho que pegar os odômetros desse array e ir subtraindo o maior pelo menor e depois somar essa diferença para chegar no km rodado. Ex:

array(3) { [0]=> array(22) { [2]=> string(5) "21:02" ["odometro"]=> string(6) "131364" }

[1]=> array(22) {[2]=> string(5) "19:31" ["odometro"]=> string(6) "130034"  }

[2]=> array(22) {[2]=> string(5) "19:50" ["odometro"]=> string(6) "129642"  }

Deu pra entender? Como eu poderia resolver esse problema?

4 respostas

Oi Thiago, você consegue fazer isso através de um array_reduce. Vejamos, você quer ir subtraindo os valores, não é isso? Então considerando o array atual, podemos fazer o seguinte:

$primeiro = array_shift($lista);
return array_reduce($lista, function($total, $i_atual){
    return $total - $i_atual['odometro']
}, $primeiro['odometro']);

O array_shift vai pegar o primeiro elemento do array e salvar na variável primeiro, depois o array_reduce vai passar por cada um dos elementos da lista fazendo a operação de subtração para cada elemento.

Você já viu o uso do reduce antes?

Quando é só dois valores, essa forma da certo. O problema é quando são vários odômetros. Ex:

140500 139400 138600

Preciso pegar 140500-139400=1400 139400-138600=800

Aí eu somo esses valores 1400+800=2200 km rodados

Preciso fazer dessa forma.

solução!

Boa noite! Eu percebi que a minha dificuldade é a lógica. Pensei bem e consegui arrumar uma maneira fácil de resolver o meu problema.

Eu faço a busca no mysql pelos odômetros cadastrados em determinado mês. Até aí está tudo bem.

Ele me retorna um array assim:

$lista = $statement->fetchAll();
return $lista;

Agora eu pego o primeiro odômetro desse array usando o current e pego o último odômetro usando o end. Faço a subtração do maior pelo menor e dá o resultado do KM rodado.

Meu problema aqui foi mais lógica. Deu para entender?

Ex: array de retorno odometro 140111 odometro 139222 odometro 138333 odometro 137444

É só eu pegar o 140111 - 137444 = 2667 km rodado

Ah Thiago, falha minha de não ter entendido que precisava subtrair o maior pelo menor, eu pensei que ia subtraindo todos. Desculpa. Eu entendi errado.

Justo, eu entendi agora. Parabéns! Se precisar de algo mais é só falar, caso não, pode marcar o tópico como solucionado.

Neste caso, marque sua própria resposta já que ela é a que mostra como você resolveu o problema.

Bons estudos!