Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia!
Eu tenho o seguinte cenário: Eu faço um foreach e pego os dados do banco e jogo para variáveis. Antes de jogar na view, eu trato as variáveis. O problema é na hora de criar um array, ele transforma tudo em string.
public function listar_cd(){
$this->load->model('cd/cd_model');
$row = $this->cd_model->exibe_cd();
//No $row ele me da o array completo de pesquisa
foreach ($row as $linha):
$datafinal[] = $linha['datafinal'];
$horafinal[] = $linha['horafinal'];
$nomecd[] = $linha['nomecd'];
$gravadora[] = $linha['gravadora'];
$class[] = $linha['class'];
$porcentagem[] = $linha['porcentagem'];
$idcd[] = $linha['idcd'];
$sla[] = $linha['sla'];
endforeach;
//se eu der um echo em $sla por ex, ele só me retorna string, qnd deveria ser int. E na regra tem um calculo
//array(7) { [0]=> string(1) "8" [1]=> string(2) "18" [2]=> string(2) "16" [3]=> string(2) "48" [4]=> string(2) "20" [5]=> string(1) "2" [6]=> string(1) "1" }
[Aqui eu aplico a regra]
//Aqui eu crio o array
$array = array(
'idcd'=>$idcd,
'nomecd'=>$nomecd,
'gravadora'=>$gravadora,
'class'=>$class,
'porcentagem'=>$porcentagem
);
echo var_dump($array);
/*
$variaveis['consulta'] = $array;
echo var_dump($variaveis);
$this->load->helper('valida_login/valida_helper');
$variaveis['validacao'] = getValida();
$this->load->helper('preenche_dados/preenche_dados_helper');
$variaveis['preenche_dados'] = getPreencheDados();
$this->load->view("menu_cd/listar_cd_view",$variaveis);*/
}
No model eu retorno os dados assim return $retorno = $this->db->get("TABELA")->result_array();
Quando jogo esse array na view sem aplicar a regra, ele da uma mensagem de "Undefined index" Porem os valores que passo estão certos.
<?php foreach ($consulta as $linha): ?>
<tr>
<td style="text-align: center;"><?php echo $linha['idcd'] ?></td>
<td style="text-align: center;"><?php echo $linha['nomecd'] ?></td>
<td style="text-align: center;"><?php echo $linha['gravadora'] ?></td>
<td style="text-align: center;"><a href="javascript:;" onclick="janelaNovoCd(<?= $linha['idcd']?>)"><button type="button" class="glyphicon glyphicon-cog"></button></a><a href="javascript:;" onclick="confirma(<?= $linha['idcd'] ?>)"><button type="button" class="glyphicon glyphicon-trash"></button></a></td>
</tr>
<?php endforeach;?>Seu foreach esta errado também, você esta percorrendo um array de uma dimensão, então não pode colocar os indices associativos como você fez, enquanto percorre o array, cada volta será um valor diferente que será printado
Se a variável row já é uma array, não faz sentido pegar strings depois do laço e transformar em array novamente para levar a Views .
Ai q tá, a variável row, na vdd é um inteiro la no banco. E eu n sei pq ta trazendo uma string.
Seu foreach esta errado também, você esta percorrendo um array de uma dimensão, então não pode colocar os indices associativos como você fez, enquanto percorre o array, cada volta será um valor diferente que será printado
Como assim? tipo isso foreach ($row->result_array() as $linha) ?
seu array é assim
$consulta = array(
'idcd'=>$idcd,
'nomecd'=>$nomecd,
'gravadora'=>$gravadora,
'class'=>$class,
'porcentagem'=>$porcentagem
);
então ao percorrer, você não pode usar
echo $linha['idcd'];
e sim somente
echo $linha;
com isso cada volta vai printar o valor de cada indice
Ai q tá, a variável row, na vdd é um inteiro la no banco. E eu n sei pq ta trazendo uma string.
O construtor foreach fornece uma maneira fácil de iterar sobre arrays. O foreach funciona somente em arrays e objetos, e emitirá um erro ao tentar usá-lo em uma variável com um tipo de dado diferente ou em uma variável não inicializada. Possui duas sintaxes:
Leia novamente
>
Leia novamente
http://php.net/manual/pt_BR/control-structures.foreach.php
O que eu quis dizer foi o seguinte: Nem todo campo do banco é uma string, por ex: idcd, porcentagem e sla são inteiros. Tem um calculo que é $sla = $sla * 60. Porém, eu n to tendo retorno de um inteiro e sim de uma string. Até o id ta sendo listado como string. Isso que eu n estou entendendo. O array n deveria retornar inteiro onde no banco é inteiro e string onde no banco é string?
>
seu array é assim
$consulta = array(
'idcd'=>$idcd,
'nomecd'=>$nomecd,
'gravadora'=>$gravadora,
'class'=>$class,
'porcentagem'=>$porcentagem
);
então ao percorrer, você não pode usar
echo $linha['idcd'];
e sim somente
echo $linha;
com isso cada volta vai printar o valor de cada indice
Então cara, da forma que eu estava fazendo, eu podia por ex, pegar uma variável QQ tipo $sla e realizar um calculo. Assim ele me da o array todo de 1 vz e ai n da p pegar o indice com valor da $sla.
Voce está usando o codeigniter?
Se a variável row já é uma array, não faz sentido pegar strings depois do laço e transformar em array novamente para levar a Views .
Exato, jovem sua variável $row já recebe um array..
simplesmente de um vardump($row) verifique os dados e passe pra view!...
Não tem sentido mesmo percorrer $row, pra montar um array na mesma estrutura !
Voce ta usando o codeigniter?
Estou sim! Percebi que ta vindo zuado do model. Uso essa função para dar o retorno $this->db->get("tabela")->result_array(); e qnd dou o var_dump no row, vem td como string, atté o q deveria ser inteiro. Antes eu usava só $this->db->get("tabela"), rodava de boa. Quando coloquei o ->result_array() que começou o problema.
Estou sim! Percebi que ta vindo zuado do model. Uso essa função para dar o retorno $this->db->get("tabela")->result_array(); e qnd dou o var_dump no row, vem td como string, atté o q deveria ser inteiro. Antes eu usava só $this->db->get("tabela"), rodava de boa. Quando coloquei o ->result_array() que começou o problema.
Esse Framework sempre foi zuado.
Se você quer só para calculo algumas variáveis, force a tipagem uai na variável.
http://php.net/manual/pt_BR/language.types.type-juggling.php
>
Exato, jovem sua variável $row já recebe um array..
simplesmente de um vardump($row) verifique os dados e passe pra view!...
Não tem sentido mesmo percorrer $row, pra montar um array na mesma estrutura !
Isso eu sei, se eu jogar a $row direto na view funciona, o problema é que tenho que passar 2 valores para view que variam de acordo com o tempo. Que é a porcentagem e a class(que muda a cor da sla). Foi a unica forma que achei de fz uma la via php, comparando data e hora final(que vem do banco) com a atual, para fazer a porcentagem subir. Tlvz de p fz via function no banco, ms ai sao outros 500 rs.
Certo cara, entendi !
então faz o seguinte.. não precisa desta lambança toda que você fez ao percorrer o array rsrs..
você só vai precisar de um array pra guardar o resultado !
$result = array();
dai você percorre $row !!
foreach($row as $key => $values) {
//Aplique o calculo aqui....
//exemplo
$dataAtual = new DateTime("now");
$dataDoBanco = new DateTime($values['datafinal']);
$diff = $dataAtual->diff($dataDoBanco); // Aqui você vai ter a diferença etc...
// seus ifs pra colorir de acordo com seu calculo !!!
$result[$key]['class'] = $calculo;
$result[$key] = $values;
}
var_dump($result);
Tenha no banco somente 1 coluna para guardar data e hora!
exemplo: datafinal do tipo Datetime, ficará mas simples tratar o retorno. tanto no banco, quanto na aplicação !
OBS:
Caso precise http://php.net/manual/pt_BR/datetime.diff.php
>
Esse Framework sempre foi zuado.
Se você quer só para calculo algumas variáveis, force a tipagem uai na variável.
http://php.net/manual/pt_BR/language.types.type-juggling.php
kkkkkk 2ª pessoa que diz pra mim q o framework é zuado kkkkk apesar de fácil, estou chegando a msm conclusão. Vlw pela paciência ai mano.
Caramba complicado de entender esse framework em.
Por isso que só uso o bom e velho puro php estruturado em MVC.
Vou dar uma explicação pelo que entendi aqui ok.
A linguagem PHP é fracamente tipada logo o tipo da variável é definido pelo contesto.
Se eu tiver uma tabela como exemplo essa
--------------------------
id | nome | valor |
--------------------------
1 | luz | 50 |
--------------------------
2 | agua | 40 |
--------------------------
Fazendo uma consulta nessa tabela e solicitando retorno como fetch_assoc seria visualizavel assim:
[
0 => [
id => 1,
nome => luz,
valor => 50
]
1 => [
id => 1,
nome => agua,
valor => 40
]
]
Agora suponha que nesse array eu queira adicinar um campo de porcentagem do valor onde o valor seria divido por 100. Então eu faria assim.
for($i = 0; $i < cont($rows); $i++):
$valor = $rows['$i']['valor'];
$porcentagem = $valor / 100;
$rows[$i] += ['porcentagem' => $porcentagem]
endfor;
Isso iria gerar o array associativo:
[
0 => [
id => 1,
nome => luz,
valor => 50,
porcentagem => 0.5
]
1 => [
id => 1,
nome => agua,
valor => 40,
porcentagem => 0.4
]
]
Agora é só enviar esse array para view e deixar esse fazer o seu trabalho.
Simples.
>
Certo cara, entendi !
então faz o seguinte.. não precisa desta lambança toda que você fez ao percorrer o array rsrs..
você só vai precisar de um array pra guardar o resultado !
$result = array();
dai você percorre $row !!
foreach($row as $key => $values) {
//Aplique o calculo aqui....
//exemplo
$dataAtual = new DateTime("now");
$dataDoBanco = new DateTime($values['datafinal']);
$diff = $dataAtual->diff($dataDoBanco); // Aqui você vai ter a diferença etc...
// seus ifs pra colorir de acordo com seu calculo !!!
$result[$key]['class'] = $calculo;
$result[$key] = $values;
}
var_dump($result);
Tenha no banco somente 1 coluna para guardar data e hora!
exemplo: datafinal do tipo Datetime, ficará mas simples tratar o retorno. tanto no banco, quanto na aplicação !
OBS:
Caso precise http://php.net/manual/pt_BR/datetime.diff.php
Mano, eu me irritei aqui e apliquei de forma procedural kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk Pior de td é que funcionou rsrs olha:
<td style="text-align: center;"><?php
$dataFinal = $linha->datafinal;
$horaFinal = $linha->horafinal;
$horaAtual = date('H');
$dataAtual = date('d/m/Y');
$sla = $linha->sla;
$sla = $sla * 60;//converte o periodo da SLA para minutos.
if($horaFinal >= $horaAtual && $dataFinal >= $dataAtual){
$porcentagem = ($minutoAtual * 100)/$sla;
$porcentagem = (int)$porcentagem;
if($porcentagem <= 25){
$class = 'success';
}else if($porcentagem >=26 && $porcentagem <=80){
$class = 'warning';
}else{
$class = 'danger';
}
}else{
$class = 'danger';
$porcentagem = 100;
}
?>
<div class="progress">
<div class="progress-bar-<?php echo $class;?>" role="progressbar" aria-valuenow="70"
aria-valuemin="0" aria-valuemax="100" style="width:<?php echo $porcentagem;?>%">
<?php echo $porcentagem,'%';?>
</div>
</div>
</td>
Ms eu ainda n tinha visto a tua postagem, vou tentar reverter e voltar pro MVC. Sei que n e boa prática, ms no caso da regra n qrer rodar d forma alguma, vale dx na view ou é mlhr dx s regra? Valeu ai pela ajuda e pela paciência mano!
Só por curiosidade
de um print_r nessa $row e poste aqui o resultado
$row = $this->cd_model->exibe_cd();
echo "<pre>";
print_r($row);
echo "</pre>";
die();>
Só por curiosidade
de um print_r nessa $row e poste aqui o resultado
$row = $this->cd_model->exibe_cd();
echo "<pre>";
print_r($row);
echo "</pre>";
die();
Array
(
[0] => Array
(
[idcd] => 3
[nomecd] => Teste
[gravadora] => MK
[datafinal] => 19/09/2016
[horafinal] => 15
[class] =>
[porcentagem] => 0
[sla] => 8
)
[1] => Array
(
[idcd] => 4
[nomecd] => Teste
[gravadora] => MK
[datafinal] => 22/09/2016
[horafinal] => 10
[class] =>
[porcentagem] => 0
[sla] => 18
)
[2] => Array
(
[idcd] => 5
[nomecd] => Teste
[gravadora] => abc
[datafinal] => 20/09/2016
[horafinal] => 7
[class] =>
[porcentagem] => 0
[sla] => 16
)
[3] => Array
(
[idcd] => 7
[nomecd] => Teste
[gravadora] => Teste
[datafinal] => 28/09/2016
[horafinal] => 18
[class] =>
[porcentagem] => 0
[sla] => 48
)
[4] => Array
(
[idcd] => 8
[nomecd] => Teste
[gravadora] => Abc
[datafinal] => 25/09/2016
[horafinal] => 14
[class] =>
[porcentagem] => 0
[sla] => 20
)
[5] => Array
(
[idcd] => 9
[nomecd] => Ali
[gravadora] => ali
[datafinal] => 19/09/2016
[horafinal] => 20
[class] =>
[porcentagem] => 0
[sla] => 2
)
[6] => Array
(
[idcd] => 55
[nomecd] => ssssssss
[gravadora] => sssssssssssssss
[datafinal] => 19/09/2016
[horafinal] => 22
[class] => success
[porcentagem] => 0
[sla] => 1
)
)$row = $this->cd_model->exibe_cd();
echo "<pre>";
var_dump($row);
echo "</pre>";
die();
Desculpe amigo era Var_dump;
Testa de novo com var_dump pra sabermos se o framework remove o type-casting do resultado, fazendo um favor
>
$row = $this->cd_model->exibe_cd();
echo "<pre>";
var_dump($row);
echo "</pre>";
die();
Desculpe amigo era Var_dump;
Testa de novo com var_dump pra sabermos se o framework remove o type-casting do resultado, fazendo um favor
Ta ai mano, ele traz td string, até os ids que são int. Isso usando o result_array() no model. Me dá tua opnião ai, acha q vale a pena continuar estudando codeigniter ou melhor mudar p outro. Se sim, ql?
array(7) {
[0]=>
array(7) {
["idcd"]=>
string(1) "3"
["nomecd"]=>
string(12) "Teste"
["gravadora"]=>
string(2) "Teste"
["datafinal"]=>
string(10) "19/09/2016"
["horafinal"]=>
string(2) "15"
["minutofinal"]=>
string(2) "50"
["sla"]=>
string(1) "8"
}
[1]=>
array(7) {
["idcd"]=>
string(1) "4"
["nomecd"]=>
string(12) "Teste"
["gravadora"]=>
string(2) "MK"
["datafinal"]=>
string(10) "22/09/2016"
["horafinal"]=>
string(2) "10"
["minutofinal"]=>
string(2) "20"
["sla"]=>
string(2) "18"
}
[2]=>
array(7) {
["idcd"]=>
string(1) "5"
["nomecd"]=>
string(5) "Teste"
["gravadora"]=>
string(3) "abc"
["datafinal"]=>
string(10) "20/09/2016"
["horafinal"]=>
string(2) "07"
["minutofinal"]=>
string(2) "18"
["sla"]=>
string(2) "16"
}
[3]=>
array(7) {
["idcd"]=>
string(1) "7"
["nomecd"]=>
string(6) "abc"
["gravadora"]=>
string(15) "Teste"
["datafinal"]=>
string(10) "28/09/2016"
["horafinal"]=>
string(2) "18"
["minutofinal"]=>
string(1) "0"
["sla"]=>
string(2) "48"
}
[4]=>
array(7) {
["idcd"]=>
string(1) "8"
["nomecd"]=>
string(4) "Kano"
["gravadora"]=>
string(13) "Teste"
["datafinal"]=>
string(10) "25/09/2016"
["horafinal"]=>
string(2) "14"
["minutofinal"]=>
string(1) "7"
["sla"]=>
string(2) "20"
}
[5]=>
array(7) {
["idcd"]=>
string(1) "9"
["nomecd"]=>
string(3) "Ali"
["gravadora"]=>
string(3) "ali"
["datafinal"]=>
string(10) "19/09/2016"
["horafinal"]=>
string(2) "20"
["minutofinal"]=>
string(2) "12"
["sla"]=>
string(1) "2"
}
[6]=>
array(7) {
["idcd"]=>
string(2) "55"
["nomecd"]=>
string(8) "ssssssss"
["gravadora"]=>
string(15) "sssssssssssssss"
["datafinal"]=>
string(10) "19/09/2016"
["horafinal"]=>
string(2) "16"
["minutofinal"]=>
string(1) "9"
["sla"]=>
string(1) "1"
}
}
Ai Ferrou, só forçando o type!!!
Cara o CI tem uma filosofia de retrocompabilidade, é um assunto bem complexo não vou entrar no mérito até por causa de defensores, mas já trabalhei com ele, e é ruim abeça, código feio olhando internamente.
Hoje em dia uma aplicação sem suporte a ferramentas externas você perde muito tempo. Não sei hoje, mas o CI não tinha incorporando ao framework as últimas novidades do mundo do PHP lá por meados de 2012, e sem composer hoje em dia fica até difícil trabalhar se você não tiver acesso a estas ferramentas, olhando aqui no git deles continua sem suporte.
Vamos a um exemplo, PHPMailer com um comando no terminal composer install or update as dependências estará instaladas e toda mapeada e pronto para usar. Já no CI é na unha.
Dentre os que já testei e uso hoje em dia é:
CakePHP 2 e 3
A versão do cakephp v2.* foi projetada para aceitar PSR-4, já na 3 é totalmente PSR-4 e via composer, só baixar o esqueleto e ta pronto para baixar todas as depencias com um simples comando. Também tem a opção de usar modulos independentes, ou seja, se quiser criar seu próprio framerwork a partir dele, ta liberado ORM, etc, o Symfony a mesma coisa.
O pessoal fala muito bem do Zend2, mas este a curva de aprendizagem é muito alta.
Ficaria entre estes tres:
CakePHP
Laravel
Symfony
>
Ai Ferrou, só forçando o type!!!
Cara o CI tem uma filosofia de retrocompabilidade, é um assunto bem complexo não vou entrar no mérito até por causa de defensores, mas já trabalhei com ele, e é ruim abeça, código feio olhando internamente.
Hoje em dia uma aplicação sem suporte a ferramentas externas você perde muito tempo. Não sei hoje, mas o CI não tinha incorporando ao framework as últimas novidades do mundo do PHP lá por meados de 2012, e sem composer hoje em dia fica até difícil trabalhar se você não tiver acesso a estas ferramentas, olhando aqui no git deles continua sem suporte.
Vamos a um exemplo, PHPMailer com um comando no terminal composer install or update as dependências estará instaladas e toda mapeada e pronto para usar. Já no CI é na unha.
Dentre os que já testei e uso hoje em dia é:
CakePHP 2 e 3
A versão do cakephp v2.* foi projetada para aceitar PSR-4, já na 3 é totalmente PSR-4 e via composer, só baixar o esqueleto e ta pronto para baixar todas as depencias com um simples comando. Também tem a opção de usar modulos independentes, ou seja, se quiser criar seu próprio framerwork a partir dele, ta liberado ORM, etc, o Symfony a mesma coisa.
O pessoal fala muito bem do Zend2, mas este a curva de aprendizagem é muito alta.
Ficaria entre estes tres:
CakePHP
Laravel
Symfony
Mano, mt obrigado pelo feedback! Comecei com CI, n tem mt tempo e n tive mts decepções rs. Mas assim que eu tiver a necessidade, vou começar a estudar 1 desses 3 que você falou.
Já ouvi falar mt bem do Symfony e que o zend é mais chatinho de aprender, porém é mais completo.
Muito obrigado!!!
Se a variável row já é uma array, não faz sentido pegar strings depois do laço e transformar em array novamente para levar a Views .