Carcleo 4 Denunciar post Postado Setembro 24, 2015 Pessoal, tenho um array que traz ano-mes em um peírodo da seguinte forma Array ( 0 -> "2014-01", 1 -> "2014-03", 2 -> "2014-06", 3 -> "2014-07", 4 -> "2014-11", 5 -> "2014-12", 6 -> "2015-01", 7 -> "2015-02", 8 -> "2015-03", 9 -> "2015-04", 10 -> "2015-07", 11 -> "2015-09" ) Existe alguma forma de eu descobrir, dado um período qualquer, quais meses faltam nesse período? Tipo, dado o período entre 2014-1 e 2015-09, retornar o array tipo: Array ( 0 -> "2014-02", 1 -> "2014-04", 2 -> "2014-05", 3 -> "2014-08", 4 -> "2014-09", 5 -> "2014-10", 6 -> "2015-05", 7 -> "2015-06", 8 -> "2015-08" ) ? Compartilhar este post Link para o post Compartilhar em outros sites
Marcos Xavier 189 Denunciar post Postado Setembro 24, 2015 Acho que com isso você já consegue fazer alguma coisa: <?php $datas =["2014-01", "2014-03", "2014-06", "2014-07", "2014-11", "2014-12", "2015-01", "2015-02", "2015-03", "2015-04", "2015-07", "2015-09" ]; echo $first= current($ar);//primeira data echo $last= end($ar);//ultima data Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 24, 2015 Desculpa Xavier, não entendi! Não dá para saber os meses que faltam só com isso. Não pelo que sei até agora! Pode me ajudar? Compartilhar este post Link para o post Compartilhar em outros sites
Marcos Xavier 189 Denunciar post Postado Setembro 24, 2015 Agora que notei que não são meses consecutivos. Se não houver uma regra para definir a sequência de meses a resposta é não. Mas com certeza você tem alguma fórmula pra ter essas datas. Compartilhar este post Link para o post Compartilhar em outros sites
Vinicius Ianni 189 Denunciar post Postado Setembro 24, 2015 Lendo rapidinho, a solução que me veio a cabeça seria comparar a array "incompleta" com uma completa e o resultado dessa comparação ser colocado numa outra array. Compara as arrays: link Mais sobre arrays: link Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 24, 2015 Tenho um campo "mesCompetencia" na tabela de pagamentos onde eu guardo a competência do mês pago por um determinado cliente a um serviço de prestação continuada. Esse campo guarda apenas o mês e o ano da competência no formato "2015-04". Esse campo esta como char (7). Mas minha dificuldade é que preciso pesquisar quais competências ainda não foram pagas em um período que vai desde a instalação do serviço e a último competência lançada. Na verdade nem é a ultima competência. Mas a mais atual. Que poderá não ser a ultima lançada (paga). A tabela é a seguinte: CREATE TABLE pagamentos ( idPagamentos INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, idPlanoClientes INT(10) NOT NULL, idAdmins INT(1) NOT NULL, mesReferencia CHAR(7) NOT NULL, dataPgto DATE NOT NULL, valorPgto DOUBLE NOT NULL, multa DOUBLE NOT NULL, desconto DOUBLE NOT NULL, totalPago DOUBLE NOT NULL, formaPgto CHAR(2) NOT NULL, observacao text, PRIMARY KEY (idPagamentos) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; A consulta que estou fazendo é a seguinte: SELECT pagamentos.idPagamentos, pagamentos.mesReferencia FROM pagamentos, planosclientes WHERE pagamentos.idPlanoClientes = planosclientes.idPlanosClientes AND pagamentos.idPlanoClientes = 8 AND pagamentos.mesReferencia BETWEEN DATE_FORMAT(planosclientes.dataInstalacao, '%Y%-%m') AND DATE_FORMAT(CURRENT_DATE(), '%Y%-%m') ; Essa consulta me retorna todos os lançamentos dentro do período determinado por ano-mês 1) Dessa forma ela esta excluindo a saída caso alguma saída para mesReferencia coincida com planosclientes.dataInstalacao ou CURRENT_DATE()* Como fazer para incluir os extremos nesta consulta? 2) Outra coisa é que preciso listar, NÃO os valores de competência que estão lançados. Mas SIM os meses de competência que faltam para preencher todos os meses daquele intervalo. Por isso estou tentando com php se não houver recurso com sql Grato a quem puder ajudar! Carlos Rocha Compartilhar este post Link para o post Compartilhar em outros sites
Marcos Xavier 189 Denunciar post Postado Setembro 24, 2015 Esse exemplo funciona mais ou menos como você precisa. Você só precisará melhorá-lo pra fazer a verificação correta dos meses. Veja aqui o problema http://stackoverflow.com/questions/10724305/how-to-add-1-month-on-a-date-without-skipping-i-e-february#answer-10724354 <?php $mesesDb = array( '2014-01', '2014-03', '2014-06', '2014-07', '2014-11', '2014-12', '2015-01', '2015-02', '2015-03', '2015-04', '2015-07', '2015-09' ); $totalMeses = count($mesesDb); $novosMeses = []; for ($i=0; $i < $totalMeses ; $i++) : $outroMes = strtotime ( '+1 month' , strtotime ( $mesesDb[$i] ) ) ; $outroMes = date ( 'Y-m' , $outroMes); if (!in_array($outroMes,$mesesDb)) { # code... // echo $mesParaTeste.'---'; array_push($novosMeses,$outroMes); } endfor ; print_r($novosMeses); Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 24, 2015 cheguei a isso: Tenho esses 2 arrays Array1 Array ( [0] => Array ( [0] => 2015-02 [1] => 8 ) [1] => Array ( [0] => 2015-03 [1] => 8 ) [2] => Array ( [0] => 2015-04 [1] => 8 ) [3] => Array ( [0] => 2015-05 [1] => 8 ) [4] => Array ( [0] => 2015-06 [1] => 8 ) [5] => Array ( [0] => 2015-07 [1] => 8 ) [6] => Array ( [0] => 2015-08 [1] => 8 ) [7] => Array ( [0] => 2015-09 [1] => 8 ) ) e Array2 Array ( [0] => Array ( [0] => 2015-02 [1] => 8 ) [1] => Array ( [0] => 2015-03 [1] => 8 ) [2] => Array ( [0] => 2015-04 [1] => 8 ) ) Preciso saber quais indices do Array2 já existem no array1 e excluir. Como procedo? usei array_diff conforme orientado acima e retornou vazio. //$result = array_diff($array2, $$array1); $result = array_diff($array1, $$array2); print "<pre>"; print_r($result); print "</pre>"; Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Setembro 24, 2015 Com base na sua primeira postagem... <?php $array = array( 0 => "2014-01", 1 => "2014-03", 2 => "2014-06", 3 => "2014-07", 4 => "2014-11", 5 => "2014-12", 6 => "2015-01", 7 => "2015-02", 8 => "2015-03", 9 => "2015-04", 10 => "2015-07", 11 => "2015-09" ); $dates = array( '2014-01', '2015-09', '2015-03' ); var_dump( array_diff( $array, $dates ) ); // resetando as chaves var_dump( array_values( array_diff( $array, $dates ) ) ); Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Setembro 25, 2015 Obrigado por toda a dedicação. Mas esse código não trouxe o retorno esperado., Acabei criando uma função com estrutura primitiva mesmo e deu certinho! <?php function comparaArray($array1, $array2) { $resultado = array(); $contaArray = 0; $verifica = false; foreach ($array2 as $indice2) { foreach ($array1 as $indice1) { if($indice2[0] == $indice1[0] && $indice2[1] == $indice1[1]) { $verifica = true; break; } } if ($verifica == false) { $resultado[$contaArray][0] = $indice2[0]; $resultado[$contaArray][1] = $indice2[1]; $contaArray++; } $verifica = false; } return $resultado; } ?> Compartilhar este post Link para o post Compartilhar em outros sites