Ir para conteúdo

Arquivado

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

Marisa Lima

Juntar dois Arrays multidimensionais

Recommended Posts

Boa tarde.

 

Tenho dois arrays em que ambos tem a mesma estrutura, apenas muda o ultimo campo. O primeiro array tem a seguinte estrutura:

array(9){
[0]=>
   array(3){
     ["Chefe"]=>
     string(14)"khdkhkhkh"
     ["nome"]=>
    string(14)"hjhjhjhjh"
    ["goals"]=>
     string(17)"khkhk"
}

O segundo array tem exactamente a mesma estrutura apenas muda o ["goals"] para ["skills"] e o que pretendo é acrescentar a seguir ao "goals" o campo "skills". Já tentei usar o array_merge, o array_merge_recursive e não funcionou.

Será que me podem dar uma ajuda?   

Obrigada.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Marisa.

 

Testei aqui e funcionou, pelo menos como eu entendi que você está querendo fazer:

 

<?php

$Array1 = array("Chefe" => "khdkhkhkh", "nome" => "hjhjhjhjh", "goals" => "khkhk");
$Array2 = array("Chefe" => "lorem", "nome" => "ipsum", "skills" => "dsfsdf");

$Array3 = array_merge($Array1, $Array2);

var_dump($Array3);

// Resultado:
// array('Chefe' => 'lorem', 'nome' => 'ipsum', 'goals' => 'khkhk', 'skills' => 'dsfsdf')

 

Imagem 1: http://prntscr.com/g3vm6l

Imagem 2: http://prntscr.com/g3vmh7

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Obrigada pela resposta.

 

Testei como disse e o meu array fica da seguinte forma depois de fazer o merge

array(19) {
 [0]=> array(3) 
 { 
 ["Chefe"]=> string(14) "sadasdasa" 
 ["nome"]=> string(14) "sadasdasa" 
 ["goals"]=> string(18) "1.6666666666666667" 
 } 
 [1]=> array(3) { 
 ["Chefe"]=> string(14) "sadasdasa" 
 ["nome"]=> string(14) "sadasdasa" 
 ["goals"]=> string(18) "1.6666666666666667" } 
 [2]=> array(3) { 
 ["Chefe"]=> string(17) "sadasdasa" 
 ["nome"]=> string(17) "sadasdasa" 
 ["goals"]=> string(18) "1.6666666666666667" } 
 [3]=> array(3) { 
 ["Chefe"]=> string(14) "sadasdasa" 
 ["nome"]=> string(14) "sadasdasa" 
 ["goals"]=> string(18) "1.6666666666666667" } 
 [4]=> array(3) { 
 ["Chefe"]=> string(14) "sadasdasa" 
 ["nome"]=> string(12) "sadasdasa" 
 ["goals"]=> string(18) "1.6666666666666667" 
 } 
 ...
 
 [10]=> array(3) 
 { ["Chefe"]=> string(14) "sadasdasa" 
 ["nome"]=> string(14) "sadasdasa" 
 ["skills"]=> string(17) "2.142857142857143" 
 } 
 [11]=> array(3) { ["Chefe"]=> string(14) "sadasdasa" 
 ["nome"]=> string(14) "sadasdasa" 
 ["skills"]=> string(1) "2" } 
 [12]=> array(3) { ["Chefe"]=> string(17) "sadasdasa" 
 ["nome"]=> string(17) "sadasdasa" 
 ["skills"]=> string(18) "2.0714285714285716" 
 } [13]=> array(3) { ["Chefe"]=> string(14) "sadasdasa" ["nome"]=> string(12) "sadasdasa" ["skills"]=> string(18) "1.8571428571428572" } 
 [14]=> array(3) { ["Chefe"]=> string(10) "sadasdasa" ["nome"]=> string(10) "sadasdasa" ["skills"]=> string(18) "0.9285714285714286" } 

 

Acrescenta o segundo array no final do primeiro criando mais posições no array e não acrescentado o campo skills ao primeiro array. O seu exemplo funciona, mas o meu array deve ter alguma coisa diferente que não deixa funcionar o merge correctamente.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta o código de como está a estrutura do seu array, por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O meu array vem de uma consulta sql...

public function getSkill(){
 $query=Yii::app()->db->createCommand("select compet from
            (select col.nome as Chefe,colaborador.nome,Avg(actm.id_avaliacao_chefe_nivel) as compet
from avaliacao_competencia_transversal_momento actm
inner join momento_avaliacao_colaborador mac on actm.id_momento_avaliacao_colaborador=mac.id
inner join dados_colaborador on mac.id_colaborador=dados_colaborador.id_colaborador
inner join momento_avaliacao ma on mac.id_momento_avaliacao=ma.id
inner join colaborador on dados_colaborador.id_colaborador=colaborador.id
inner join colaborador col on dados_colaborador.id_chefe=col.id
where ma.ano='$ano' Group by nome) Q")->queryAll();
return $query;}

 

Não sei se ajuda... O que eu faço é invocar a função e a partir daqui tento fazer o merge dos arrays. O segundo array é obtido da mesma forma.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente... no meu exemplo estava tratando de um array contendo valores, no seu caso possui um array com outro array.

Analisando a documentação, encontrei nos comentários um função (http://php.net/manual/pt_BR/function.array-merge-recursive.php#92195) para tratar deste caso. Testei e funcionou. Fiz umas modificações e irei postá-la, mas caso alguém saiba de uma solução melhor para este caso...

 

<?php
$Array1 = array(array("Chefe" => "khdkhkhkh", "nome" => "hjhjhjhjh", "goals" => "khkhk"));
$Array2 = array(array("Chefe" => "lorem", "nome" => "ipsum", "skills" => "df77"));

function array_merge_recursive_distinct(array $Array1, array $Array2)
{
    $Merged = $Array1;
    foreach ($Array2 as $Key => $Value) {
        if (is_array($Value) && isset($Merged[$Key]) && is_array($Merged[$Key])) {
            $Merged[$Key] = array_merge_recursive_distinct($Merged[$Key], $Value);
            continue;
        }
        $Merged[$Key] = $Value;
    }
    return $Merged;
}

$Array3 = array_merge_recursive_distinct($Array1, $Array2);
var_dump($Array3);

// result:
// array (size=1)
//   0 =>
//     array (size=4)
//       'Chefe' => string 'lorem' (length=5)
//       'nome' => string 'ipsum' (length=5)
//       'goals' => string 'khkhk' (length=5)
//       'skills' => string 'df77' (length=4)

 

A função faz uma "varredura" pelo array verificando se aquele índice é um array ou somente um valor, caso seja somente um valor ele o adiciona à variável $Merged, se não ele chama novamente a função enviando aquele índice.

É como se ele "quebrasse" os arrays, para que assim pudessem ser adicionados à variável $Merged.

 

Exemplificando é como se a função recebesse um pacote de bolinhas de gude. Ele verifica uma por uma, dentro do pacote há outros pequenos pacotes, então ele os abre e conta como bolinhas de gude normais.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá bom dia.

 

Obrigada pela ajuda. Testei e funciona, mas lembrei de um problema que pode acontecer, que é os arrays não terem o mesmo comprimento.

No exemplo que eu estou a testar neste momento, tem tamanhos diferentes o que ao fazer o merge todos os dados são baralhados e não tenho como garantir que os arrays vão ser iguais em termos de tamanho.

Existe alguma forma de contornar esta situação?

 

 

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.