Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A princípio, seu problema é aqui:

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

Só remova o json_encode que deve funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por 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
       
       
    • Por 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
    • Por 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
    • Por 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?

    • Por 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;  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.