Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

Guilherme Luiz

Flatten array

Recommended Posts

Olá pessoal,

 

Esotu com um pequeno "bug" ou algo mal codado que há situações onde meu array cria indices e há momentos que ele não cria indices...

Vejam o código:

 //implode de ids vindo de multiple select agrupados em json
 $idGrupo    = implode(",",$x['grupo']);

//Consulto no BD todos os detalhes do grupo selecionado
 $queryGrupo = "SELECT ddi,id FROM bookgroup WHERE user_id='{$userID}' and id IN ($idGrupo)";
 $sqlGrupo   = mysqli_query($connect_sql,$queryGrupo);
 $grupo = [];

//fetch todos os grupos selecionados com id e ddi num novo array para reutilizare
while($bdd = mysqli_fetch_assoc($sqlGrupo)){
  $grupo[] = [
    "id"  => $bdd['id'],
    "ddi" => $bdd['ddi']
  ];
}

//implode de todos os IDs agrupados num json de checkboxes selecionados pelo usuario
$idContato    = implode(",",$x['ids']);

//Consulto dados dos contatos e os agrupo num array para reutilizar
$queryContato = "SELECT ddi,id,group_id FROM phonebook WHERE user_id='{$userID}' and id IN ($idContato)";
$sqlContato   = mysqli_query($connect_sql,$queryContato);
$contato = [];

//fetch os contatos selecionados e checa se o ddi do grupo é idem ao ddi do contato
while($bdd = mysqli_fetch_assoc($sqlContato)){

//array com os grupos existentes no contato
$contato['oldGroup'][$bdd['id']] = ((json_decode($bdd['group_id'],true) == null) ? [] : json_decode($bdd['group_id'],true));

//fetch e agrupo os grupos por contato
 foreach($grupo as $grp){
   if($grp['ddi'] == $bdd['ddi']){
     $contato['newGroup'][] = [
       "grupoID" => $grp['id'],
       "cttID"   => $bdd['id']
     ];
   }
 }
}

//Agrupo loop com base no ID do contato
$agrupaContato = [];
foreach ($contato['newGroup'] as $key => $element) {
    $agrupaContato[$element['cttID']][] = $element['grupoID'];
}

//Agrupo o loop vom base no ID e monto nova chave de grupos mantendo os já existentes
foreach($agrupaContato as $key => $value){
	//checo se grupo não pertence
    if(!in_array($value, $contato['oldGroup'][$key])){
      $novoGrupo[$key] = array_merge($value,$contato['oldGroup'][$key]);
      $novoGrupo[$key] = array_unique($novoGrupo[$key]);

	//se não pertencer, mantenho grupo de array intacto
    }else{
      $novoGrupo[$key] = $contato['oldGroup'];
    }
}

//Salvo o novo conjunto de array em json no banco de dados dos grupos selecionados ao contato
foreach($novoGrupo as $key => $teste){
  $listaGrupos[$key] = json_encode($novoGrupo[$key]);
  $queryUpdate = "UPDATE phonebook SET
  group_id = '{$listaGrupos[$key]}'
  WHERE user_id='{$userID}' and id='{$key}'";
  $sqlUpdate   = mysqli_query($connect_sql,$queryUpdate);
}
  echo mysqli_error($connect_sql);
  echo json_encode($sqlUpdate);

Vamos supor que um contato é selecionado e nele tem salvo o json de grupos

["1","3","5"]

O que meu código faz é identificar se o grupo selecionado faz parte deste json, se não fizer o adiciona e se fizer não o adiciona mantendo o objeto intacto

Quando eu seleciono todos os grupos já existentes no contato, o json é salvo no formato que pretendo, que é:

["1","3","5"]

Agora, se eu seleciono apenas um ou dois grupos, mas não todos dos já existentes no contato, o array de grupos é salvo como

{0:1,1:3,2:5}

 

Ou seja, errado porque não quero que salve com indices.

Como posso ajustar esse código para que eu sempre consiga salvar o array limpo sem indices?

Share this post


Link to post
Share on other sites

A princípio, seu problema é aqui:

$listaGrupos[$key] = json_encode($novoGrupo[$key]);

Só remova o json_encode que deve funcionar.

Share this post


Link to post
Share on other sites

  • Similar Content

    • By ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • By mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • By mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • By clovis.sardinha
      Bom dia.
      Meu problema é o seguinte:
      Estou fazendo uma tabela e preciso mostrar o usuário e várias cidades que pertencem a este usuário.
      O resultado do array é o seguinte:

      Quando passo para a tabela os valores de cidade se repetem para o mesmo usuário até o final e retorna fazendo o mesmo para o próximo usuário. 
      Veja abaixo

       
      Meu código para a tabela é a seguinte:
      <tr> <td align="left"><?php echo $usuario['nome'] ?></td> <td align="left"><?php echo $usuario['nome_orgao'] ?></td> <td align="left"><?php echo $usuario['nome_funcao'] ?></td> <?php foreach($destinos as $key=>$destino):?> <?php $key=0;?> <td align="left"> <?php foreach($destino as $chave=> &$cidade): ?> <?php echo $cidade['cid_nome']."-";?> <?php endforeach;?> </td> <?php $key+=$key; ?> <?php endforeach;?> <td><?php echo date('d/m/Y', strtotime( $usuario['created_at'])) ?></td> <td align="left"><a href="<?php echo base_url('UserAdmin/Usuario/getUsuarioById')."/".$usuario['id_user'] ?>">DETALHES</a></td> </tr> <?php endforeach ?> Onde estou errando? O que tenho de fazer para percorrer este array de modo a aparecer apenas as cidades pertencentes a cada usuário?

    • By Giovanird
      Listo um array pelo foreach e preciso pegar os valores fora do foreach.
      Abaixo tenho o exemplo do foreach com os valores
       
      <?php foreach($turma $rsturma): if(($rsturma['id'] == 1){ echo $rsturma['nome']."<br>"; echo $rsturma['idade']."<br><br>"; } endforeach; //Dentro do foreach me retorna: Luis 13 Maria 12 Carlos 12 Matheus 14 Andréa 12 //Preciso pegar a posição e o valor desta lista $posicao1 = 1; $nome1 = Luis; $posicao2 = 2; $nome2 = Maria; $posicao3 = 3; $nome3 = Carlos; $posicao4 = 4; $nome4 = Matheus; $posicao5 = 5; $nome5 = Andréa;  
×

Important Information

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