Jump to content

Matheus Tavares

Moderadores
  • Content count

    1814
  • Joined

  • Last visited

  • Days Won

    32

Matheus Tavares last won the day on June 30 2018

Matheus Tavares had the most liked content!

Community Reputation

167 Muito Bom

About Matheus Tavares

  • Rank
    The Obstacle Is The Way • Ego Is The Enemy

Contato

  • Site Pessoal
    http://www.matheustavares.com.br

Recent Profile Visitors

4809304 profile views
  1. Matheus Tavares

    Calculo entre duas variáveis

    Imagina, @biakelly, ninguém nasce sabendo. :P Lembrando que bcmul é apenas uma multiplicação como qualquer outra, com duas diferenças-chave: 1 - Ele vai permitir definir a escala, ou seja, quantos dígitos eu gostaria de visualizar. Exemplo: <?php $precototal = '0.002822102460892938'; $totalemitido = '10,454,760.506412'; $precototal = str_replace( ',', '', $precototal ); $totalemitido = str_replace( ',', '', $totalemitido ); echo $precototal * $totalemitido; echo "\n"; echo bcmul( $precototal, $totalemitido, 25 ); Saída: 29504.405353192 29504.4053531916039105945184560 2 - Ele vai ser mais preciso do que as operações comuns. https://www.php.net/manual/pt_BR/language.types.float.php https://www.leaseweb.com/labs/2013/06/the-php-floating-point-precision-is-wrong-by-default/ Principalmente falando de dinheiro, você sempre vai querer utilizar funções com precisão, como as da biblioteca BCMath ou gmp.
  2. Matheus Tavares

    Ajudinha com regra de preço

    Kkkk imagina :P É um incremento. Cada vez que rodamos essa linha, a variável vai aumentar seu valor em 1. Veja no manual: https://www.php.net/manual/pt_BR/language.operators.increment.php Há uma sutil diferença entre ++$var (pré-incremento) e $var++ (pós-incremento). <?php $i = 1; echo ++$i + 10;// Resultado: 12 echo "\n"; echo $i;// 2 echo "\n\n"; $i = 1; echo $i++ + 10;// Resultado: 11 echo "\n"; echo $i;// 2 No pré-incremento, primeiro faz-se a soma, depois as demais operações. No pós-incremento, primeiro as operações são executadas, depois disso a soma. Quando utilizei apenas: ++$cotacoes_utilizadas; Ele apenas somou 1. Não há outras operações, não faria nenhuma diferença utilizar o pós-incremento: $cotacoes_utilizadas++; Que ainda seria o mesmo que: $cotacoes_utilizadas += 1; Ou ainda: $cotacoes_utilizadas = $cotacoes_utilizadas + 1; Tudo a mesma coisa :)
  3. Matheus Tavares

    Regra para mensagens de BOT Telegram com PHP

    Oi @biakelly, ainda não estou 100%, mas estou melhorando bem rápido. Então, a minha resposta anterior estava se referindo apenas à união de strings com arrays baseado na sua tentativa, mas você disse algo que me chamou atenção: Talvez essa (a técnica que estava discutindo) não seja a forma correta de fazer o que você precisa. Você precisa ver bem a documentação do Telegram e alguns exemplos sobre esse recurso. Veja: https://stackoverflow.com/questions/45894518/how-to-create-inline-buttons-in-php-bot-telegram https://stackoverflow.com/questions/60529715/telegram-inline-keyboards-php https://stackoverflow.com/questions/41709382/telegram-bot-inline-keyboard-not-displaying-php https://github.com/php-telegram-bot/inline-keyboard-pagination Observe que nesses exemplos eles usam um padrão diferente do que mencionei, além de utilizarem json_encode e não urlencode. Talvez esse tutorial possa lhe ajudar nesse sentido: https://luizmarcus.com/php/utilizando-inline-keyboard-em-um-bot-para-o-telegram/
  4. Matheus Tavares

    Formatar número inteiro para decimal para inserir no BD

    Olá amigo, tudo bem? Seu primeiro número está, vamos supor, em centavos e você quer armazenar em reais. O number_format não vai mudar a unidade, ele vai apenas formatar a string do número para exibir com outra notação. Você precisa, então, dividir esse número por 100. Exemplo: $numero = 2961966;// centavos $numero /= 100; echo $numero;// 29619.66 (reais)
  5. Matheus Tavares

    Calculo entre duas variáveis

    Olá @biakelly, você está quase lá... 1 - Precisa retirar as vírgulas, os pontos representam os decimais e precisam estar na conta. Portanto: // Primeiro retiramos a vírgula com o str_replace. // O (float) força o tipo de variável a ser um float, ou seja, número com decimais. // Se price fosse originalmente '424,123.123', isso significa que era uma string // com vírgulas representando os milhares. $price = (float)str_replace( ',', '', $price);// Agora passaria a ser 424123.123 Você faz o mesmo com a outra variável, multiplica uma pela outra e aplica o number_format. Não precisa da divisão por 10000000000... O único problema é que como são números muito grandes, talvez você precise de uma biblioteca para lidar com a precisão dessa matemática, como fiz naquele exemplo da soma da API, para você, sabe? Nesse caso a matemática seria algo assim: <?php $precototal = '0.002822102460892938'; $totalemitido = '10,454,760.506412'; $precototal = str_replace( ',', '', $precototal ); $totalemitido = str_replace( ',', '', $totalemitido ); echo $precototal . "\n"; echo $totalemitido . "\n"; echo bcmul( $precototal, $totalemitido, 10 ); Resultado: 0.002822102460892938 10454760.506412 29504.4053531916 E agora vem o number_format para colocar esse produto no padrão brasileiro, ou outro desejado, mas o resultado do cálculo é essa terceira linha.
  6. Matheus Tavares

    Ajudinha com regra de preço

    Olá @biakelly. Você poderia fazer algo assim: $cotacao = 0; $cotacoes_utilizadas = 0; if ( $dolar_google ) { ++$cotacoes_utilizadas; $cotacao += $dolar_google; } if ( $dolar_uol ) { ++$cotacoes_utilizadas; $cotacao += $dolar_uol; } $cotacao /= $cotacoes_utilizadas;// (divisão da soma das cotações pela qtd. utilizada). Ex: 10/2 ou 5/1 Você também pode utilizar cron jobs e armazenar a cotação em cache, sempre mantendo-a a mais correta possível sem precisar fazer essa requisições em cada consulta.
  7. Matheus Tavares

    [Resolvido] Soma array

    Olá @Marcos Vinícius. Que bom que você já resolveu, mas respondendo sua questão original: Você poderia ter, dentro do while, feito a soma da variável, assim: $soma = 0; while($dados = mysqli_fetch_array($resultado)){ $valor = $dados["valor"]; $soma += $valor;// se $valor for a variável que você gostaria de obter o somatório $dias = $dados["dias"]; $perc = $valor/$dias; $arr=array("$perc"); } echo $soma; O array_sum, dentro do seu contexto, faria um segundo loop, que seria muito mais lento. Além disso ele soma apenas os valores dentro de um array, como nesse exemplo: $array = [ 10, 20, 30, 40, 50 ]; echo array_sum( $array );// 150 Mas não era seu caso, pois seu array era mais complexo. Ao menos que você fizesse o seguinte (isso iria adicionar ainda mais loops, ou seja, não é muito recomendadável, mas seria uma opção fácil): <?php $array = [ [ 'id' => 1, 'valor' => 10, 'nome' => 'foo' ], [ 'id' => 2, 'valor' => 20, 'nome' => 'bar' ], [ 'id' => 3, 'valor' => 30, 'nome' => 'baz' ], ]; $valores = array_column( $array, 'valor' ); /** * $valores agora possui: * Array * ( * [0] => 10 * [1] => 20 * [2] => 30 * ) */ echo array_sum( $valores );// 60
  8. Matheus Tavares

    Regra para mensagens de BOT Telegram com PHP

    Olá @biakelly, tudo bem? Estava um pouco indisposto nos últimos dias e não pude dar atenção à sua dúvida antes, mas vamos lá: Pelo que entendi as linhas estão invertidas, certo? $keyboard vem antes do if, mas na hora de colar você trocou a ordem, é isso? Pois do contrário não faria muito sentido. Assumindo que keyboard venha antes, e portanto é um array, quando você joga ele no file_get_contents você está unindo uma string com um array, o que não pode ser feito. String é apenas texto, array é um conjunto de dados de diferentes tipos. <?php $keyboard = ['inline_keyboard' => [[ ['Alunos', 'url' => 'https://www.link.com/admin/alunos/'], ['notas', 'url' => 'https://www.link.com/admin/notas/'] ]]]; echo "Concatenação de string com array: {$keyboard}"; O exemplo acima retorna isso: Concatenação de string com array: Array (e uma mensagem de erro, pois essa concatenação está incorreta, mas o PHP se forçou a tentar executá-la mesmo assim). Você precisa portanto formatar esse array para uma string. Mas antes vamos fazer uns pequenos ajustes na construção do array em si: $keyboard = ['inline_keyboard' => [[// aqui está criando 2 arrays. Apenas 1 seria suficiente ['Alunos', 'url' => 'https://www.link.com/admin/alunos/'], ['notas', 'url' => 'https://www.link.com/admin/notas/'] ]]]; //Portanto: $keyboard = ['inline_keyboard' => [ ['Alunos', 'url' => 'https://www.link.com/admin/alunos/'], ['notas', 'url' => 'https://www.link.com/admin/notas/'] ]]; // Também poderíamos adicionar uma chave para 'alunos' e 'notas', assim como as URLs: $keyboard = ['inline_keyboard' => [ [ 'name' => 'Alunos', 'url' => 'https://www.link.com/admin/alunos/'], [ 'name' => 'notas', 'url' => 'https://www.link.com/admin/notas/'] ]];// agora sim O próximo passo seria formatar a string. Isso poderia ser feito com um foreach por exemplo. Veja: $string = ''; foreach ( $keyboard[ 'inline_keyboard' ] as $values ) { $name = $values[ 'name' ]; $url = $values[ 'url' ]; $string .= "{$name}: {$url}\n"; } echo $string; Resultado: Alunos: https://www.link.com/admin/alunos/ notas: https://www.link.com/admin/notas/ Por fim, você só precisaria enviar essa string na URL, mas você não pode simplesmente inserir essa string, pois ela contém caracteres que iriam deformar a requisição do file_get_contents. Você precisa utilizar urlencode. Assim: file_get_contents($path . "/sendmessage?chat_id=" . $chatId . '&text=' . urlencode( $string )); O urlencode converte caracteres como espaços, quebras de linha, barras, em suas representações amigáveis para o tráfego na URL :D
  9. Matheus Tavares

    [Resolvido] Somar dados recuperados de uma API

    Olá @biakelly Show demais! =D Sim, recomendo que você dê atenção a esse assunto, pois é realmente muito útil e não é tão difícil, mas que bom que conseguiu resolver com arquivos. Vou marcar aqui como resolvido. Até mais :)
  10. Matheus Tavares

    Manipulação de Array

    Certo, entendi. Acredito que uma forma mais fácil de resolver isso seja com GROUP e COUNT através do seu banco de dados, se você estiver trabalhando com MariaDb/Mysql, PostgreSQL, por exemplo, mas desconsiderando essa opção, no PHP você poderia fazer assim: 1 - Pegue os dados da sua fonte. Você deve ter um array parecido com esse: $interacoes = [ [ 'funcionario' => 'Joao', 'empresa' => 'Google', ], [ 'funcionario' => 'Maria', 'empresa' => 'Face', ], [ 'funcionario' => 'Joao', 'empresa' => 'Padaria', ], [ 'funcionario' => 'Alfredo', 'empresa' => 'Google', ], [ 'funcionario' => 'Gilberto', 'empresa' => 'Google', ], [ 'funcionario' => 'Gilberto', 'empresa' => 'Google', ], [ 'funcionario' => 'Maria', 'empresa' => 'Face', ], [ 'funcionario' => 'Joao', 'empresa' => 'Google', ], [ 'funcionario' => 'Gilberto', 'empresa' => 'Google', ], [ 'funcionario' => 'Joao', 'empresa' => 'Google', ], ]; Daí se eu entendi direito, você quer contar as ocorrências de Funcionário X Empresa. Existem diversas formas de se fazer isso. Com orientação a objetos seria com certeza a mais intuitiva e menos frágil a confusões, outras formas seriam utilizando array_combine, array_values, array_keys, array_column e array_unique. Todas essas funções lhe poderiam ser úteis, e por isso reocomendo a leitura: https://www.php.net/manual/pt_BR/function.array-combine.php https://www.php.net/manual/pt_BR/function.array-column.php Com foreach manualmente acaba ficando mais performático, pois as funções que citei acima são basicamente foreach nativos, ou seja, você acabaria fazendo diversos loops para chegar à solução. Eu particularmente, apesar de gostar muito dessas ferramentas, tendo a evitá-las por essa razão. Bom, o próximo passo seria agrupar os usuários, as empresas e suas contagens, isso você pode fazer assim: $contadorInteracoes = []; foreach( $interacoes as $interacao ) { $funcionario = $interacao[ 'funcionario' ]; $empresa = $interacao[ 'empresa' ]; if ( !isset( $contadorInteracoes[ $funcionario ] ) ) $contadorInteracoes[ $funcionario ] = []; if ( !isset( $contadorInteracoes[ $funcionario ][ $empresa ] ) ) $contadorInteracoes[ $funcionario ][ $empresa ] = 0; ++$contadorInteracoes[ $funcionario ][ $empresa ]; } print_r( $contadorInteracoes ); Mas esse bando de isset está incomodando, né? Sem eles vamos ficar recebendo erros, pois não podemos atribuir uma chave enraizada de um array se ela não existe. Por sorte temos o recurso de atribuição por referência, que pode simplificar isso pra gente: $contadorInteracoes = []; foreach( $interacoes as $interacao ) { $funcionario = $interacao[ 'funcionario' ]; $empresa = $interacao[ 'empresa' ]; $contador =& $contadorInteracoes[ $funcionario ][ $empresa ];// atribuição por referência $contadorInteracoes[ $funcionario ][ $empresa ] = ++$contador; } print_r( $contadorInteracoes ); Veja mais detalhes sobre esse operador: https://www.php.net/manual/pt_BR/language.references.whatdo.php#language.references.whatdo.assign Essa técnica me permitiu a definição enraizada dos valores sem me preocupar com a existência deles, do contrário o código exigiria alguns operadores null coalescing, operadores Elvis, ifs, isset, empty ou algo assim, como no primeiro exemplo. Se ficar com dúvidas em relação a isso, eu posso me aprofundar um pouco mais. A saída desse exemplo seria essa: Array ( [Joao] => Array ( [Google] => 3 [Padaria] => 1 ) [Maria] => Array ( [Face] => 2 ) [Alfredo] => Array ( [Google] => 1 ) [Gilberto] => Array ( [Google] => 3 ) ) Espero que seja isso que você estava precisando :)
  11. Matheus Tavares

    Help - Como pegar array de um formulário e inserir no banco

    Olá amigo, tudo bem? Minha resposta faz exatamente isso. Veja: Estrutura do banco: Consulta (inserção múltipla): Como a tabela ficou após a consulta: Você precisa apenas adicionar as outras colunas na string da query. No meu exemplo inicial eu não sabia a estrutura das suas colunas, então fiz utilizando apenas a cidade_id, já nas fotos utilizei mais colunas, conforme seu código. Basta adaptar a primeira linha com $sql :)
  12. Matheus Tavares

    Manipulação de Array

    Olá amigo, tudo bem? Seja bem-vindo. Gostaria de ajudar você, mas infelizmente não entendi sua dúvida =/ Se puder dar alguns exemplos e postar um trecho relevante do seu código, seria melhor.
  13. Matheus Tavares

    [Resolvido] Função para formatar URL

    Olá @Jack Oliveira, tudo bem? Vou lhe apresentar uma função bem legal do PHP, a parse_url: <?php $url1 = 'https://www.facebook.com/gilberto.gil'; $url2 = 'https://instagram.com/gilberto.gil/posts'; $url3 = 'https://twitter.com/gilberto.gil?parametro_qualquer=123'; $parsed_url1 = parse_url( $url1 ); $parsed_url2 = parse_url( $url2 ); $parsed_url3 = parse_url( $url3 ); print_r( $parsed_url1 ); print_r( $parsed_url2 ); print_r( $parsed_url3 ); Saída: Array ( [scheme] => https [host] => www.facebook.com [path] => /gilberto.gil ) Array ( [scheme] => https [host] => instagram.com [path] => /gilberto.gil/posts ) Array ( [scheme] => https [host] => twitter.com [path] => /gilberto.gil [query] => parametro_qualquer=123 ) Massa né? Bom, assim facilita bastante pra pegar o usuário. Basta pegar o path, retirar a primeira barra e cortar a partir da próxima barra. Algo assim: <?php function getSocialUser( $uri ) { $parsed = parse_url( $uri ); $path = $parsed[ 'path' ];// Usuário, mas com caracteres que devem ser filtrados $host = str_replace( 'www.', '', $parsed[ 'host' ] );// Retiramos o 'www.' $host_name = explode( '.', $host )[ 0 ];// Separamos por '.' e pegamos a primeira parte $allowed_hosts = [ 'twitter', 'facebook', 'instagram' ];// Hosts permitidos if ( !in_array( $host_name, $allowed_hosts ) ) return false;// Se não estiver entre os permitidos, retorne falso (ou exception) return strtok( ltrim( $path, '/' ), '/' );// retorna o usuário filtrado } $url1 = 'https://www.facebook.com/gilberto.gil'; $url2 = 'http://instagram.com/gilberto.gil/posts'; $url3 = 'https://twitter.com/gilberto.gil?parametro_qualquer=123'; $url4 = 'https://google.com/gilberto.gil?parametro_qualquer=123'; echo ( getSocialUser( $url1 ) ?: 'Inválido' ) . "\n"; echo ( getSocialUser( $url2 ) ?: 'Inválido' ) . "\n"; echo ( getSocialUser( $url3 ) ?: 'Inválido' ) . "\n"; echo ( getSocialUser( $url4 ) ?: 'Inválido' ) . "\n"; Saída: gilberto.gil gilberto.gil gilberto.gil Inválido Observe que os testes contemplam exemplos com http, https, parâmetros arbitrários, url com caminho excedente, com www e sem www. Veja esse código rodando: https://3v4l.org/Uib0j
  14. Matheus Tavares

    Duvida excluir um valor do BD após 30 dias

    Bom, mas você não pode ser tão leigo, só precisa de um empurrãozinho, afinal de contas seu sistema já está funcionando e selecionando os usuários, atribuindo seus dados em sessões, certo? Ao menos que eu tenha entendido errado. Bom, nesse caso, poste o código que faz o login do usuário nesse momento. É basicamente a partir de modificações nele que podemos fazer o que você quer, e nisso nós podemos ajudar você.
  15. Matheus Tavares

    Duvida excluir um valor do BD após 30 dias

    Olá @Xicara, tudo bem? Você pode sim fazer como você sugere. Isso seria feito através de cron jobs, porém não seria a melhor solução. O ideal é você criar uma tabela adicional chamada assinaturas, vips, planos, ou algo assim. Nessa tabela você teria: #id, &id_usuario, tipo_plano (1 a 5), inicio_plano, fim_plano Daí você relaciona o usuário com seu último plano e verifica se está dentro de início_plano e fim_plano, que são colunas representando o intervalo de vigência dos planos. Dessa forma você não precisa modificar nada no seu banco, apenas validar a assinatura do usuário com IFs ou outras operações simples, entende?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.