Ir para conteúdo
xSmoking

Reorganizar array com filhos e pais

Recommended Posts

Estou fazendo um select no meu banco de dados jutando várias informações, e estou salvando os resultados num array, que está organizado desta forma: https://imgur.com/ViUNR3i

 

O que eu estou tentando fazer é ordenar os pais e os filhos de acordo com o `level` mostrado na imagem, colocando os filhos dentro de um novo array do seu respectivo pai.

Por exemplo:

0 => {
    "ordination": "10501"
    "level": 3
    "children":
    0 => {
        "ordination": "1050101"
    	"level": 4
        "children":
            0 => {
                "ordination": "1050101001"
                "level": 5
            }
            1 => {
                "ordination": "1050101002"
                "level": 5 
            }
    1 => {
        "ordination": "1050102"
        "level": 4
        "children":
        0 => {
            "ordination": "1050101001"
            "level": 5
        }
    }
}

Tentei pensar em uma lógica correndo pelo array de trás para frente, mas mesmo assim não consegui finalizar.

Alguma ideia de como eu possa reorganizar o array do jeito mostrado a cima?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Não entendi uma coisa... na sua foto você tem um item nível 5 e dois níveis 4, daí você fez a flechinha apontando o 5 para um dos 4 (um nó-filho, no caso). Como você sabe qual dos dois 4 é o pai do 5? É só seguir a ordem mesmo?

 

Tirando esse conflito, o resto é relativamente fácil: você faz um loop ao redor desses itens, extraindo todos do níveis da vez e injetando em um novo array. Assim:

 

1 - Volta nos níveis 1: pega todos os níveis 1, remove do array (para acelerar as próximas buscas) e insere na raíz.

2 - Volta nos níveis 2: pega todos os níveis 2, remove do array (para acelerar as próximas buscas) e insere em seu respectivo pai (só precisa determinar qual é o pai, se tiver mais de um nesse nível).

Exemplo:

<?php
$array = [
    [ 'level' => 6, 'nome' => 'sexto' ],
    [ 'level' => 3, 'nome' => 'terceiro2' ],
    [ 'level' => 3, 'nome' => 'terceiro1' ],
    [ 'level' => 4, 'nome' => 'quarto' ],
    [ 'level' => 10, 'nome' => 'decimo' ],
    [ 'level' => 1, 'nome' => 'primeiro' ],
    [ 'level' => 2, 'nome' => 'segundo' ],
    [ 'level' => 5, 'nome' => 'quinto' ],
    [ 'level' => 8, 'nome' => 'oitavo' ],
    [ 'level' => 9, 'nome' => 'nono3' ],
    [ 'level' => 9, 'nome' => 'nono2' ],
    [ 'level' => 9, 'nome' => 'nono1' ],
    [ 'level' => 7, 'nome' => 'setimo2' ],
    [ 'level' => 7, 'nome' => 'setimo1' ],
];

function extraiNivel( &$array, $nivel ) {
    $return = [];
    foreach ( $array as $i => $folha )
        if ( $folha[ 'level' ] === $nivel ) {
            $return[] = $folha;
            unset( $array[ $i ] );
        }
    
    return $return;
}

echo "Array inicial:\n";
print_r( $array );

echo "Extraídos level 3 (agora você os colocaria na posição correta do array):\n";
print_r( extraiNivel( $array, 3 ) );

echo "Extraídos level 9 (agora você os colocaria na posição correta do array):\n";
print_r( extraiNivel( $array, 9 ) );

echo "Array final (falta extrair e processar os demais...):\n";
print_r( $array );

 

Resultado:

Spoiler

Array inicial:
Array
(
    [0] => Array
        (
            [level] => 6
            [nome] => sexto
        )

    [1] => Array
        (
            [level] => 3
            [nome] => terceiro2
        )

    [2] => Array
        (
            [level] => 3
            [nome] => terceiro1
        )

    [3] => Array
        (
            [level] => 4
            [nome] => quarto
        )

    [4] => Array
        (
            [level] => 10
            [nome] => decimo
        )

    [5] => Array
        (
            [level] => 1
            [nome] => primeiro
        )

    [6] => Array
        (
            [level] => 2
            [nome] => segundo
        )

    [7] => Array
        (
            [level] => 5
            [nome] => quinto
        )

    [8] => Array
        (
            [level] => 8
            [nome] => oitavo
        )

    [9] => Array
        (
            [level] => 9
            [nome] => nono3
        )

    [10] => Array
        (
            [level] => 9
            [nome] => nono2
        )

    [11] => Array
        (
            [level] => 9
            [nome] => nono1
        )

    [12] => Array
        (
            [level] => 7
            [nome] => setimo2
        )

    [13] => Array
        (
            [level] => 7
            [nome] => setimo1
        )

)
Extraídos level 3 (coloca na posição correta do array):
Array
(
    [0] => Array
        (
            [level] => 3
            [nome] => terceiro2
        )

    [1] => Array
        (
            [level] => 3
            [nome] => terceiro1
        )

)
Extraídos level 9 (coloca na posição correta do array):
Array
(
    [0] => Array
        (
            [level] => 9
            [nome] => nono3
        )

    [1] => Array
        (
            [level] => 9
            [nome] => nono2
        )

    [2] => Array
        (
            [level] => 9
            [nome] => nono1
        )

)
Array final (falta extrair e processar os demais...):
Array
(
    [0] => Array
        (
            [level] => 6
            [nome] => sexto
        )

    [3] => Array
        (
            [level] => 4
            [nome] => quarto
        )

    [4] => Array
        (
            [level] => 10
            [nome] => decimo
        )

    [5] => Array
        (
            [level] => 1
            [nome] => primeiro
        )

    [6] => Array
        (
            [level] => 2
            [nome] => segundo
        )

    [7] => Array
        (
            [level] => 5
            [nome] => quinto
        )

    [8] => Array
        (
            [level] => 8
            [nome] => oitavo
        )

    [12] => Array
        (
            [level] => 7
            [nome] => setimo2
        )

    [13] => Array
        (
            [level] => 7
            [nome] => setimo1
        )

)

 

 

Sacou? Fiz a extração do 3 e do 9 manualmente para exemplificar, mas a ideia seria um loop em todos os níveis. O processamento e injeção no novo array fica por sua conta.

Dá pra otimizar um pouco mais a função, mas dessa forma ela está poupando bastante memória, que eu creio que seja o mais importante nesse problema.

 

A questão é que dessa forma você perde um pouco o conceito de ordem, uma vez que você agrupa os itens por nível... nesse caso você teria que fazer um loop um pouquinho mais complexo (e menos eficiente), mas esse código já é um pontapé inicial.

 

Outro caminho é utilizar as funções nativas do PHP. Exemplos úteis para você seriam: array_column, array_combine, array_walk, etc...

 

Bom.. dito isso, complemento: lidar com arrays não é a forma correta para solucionar esse problema. Existem estruturas de dados mais apropriadas. Veja esse material: https://forum.imasters.com.br/topic/562468-resolvido-estrutura-de-um-projeto-de-marketing-multinível-com-php-e-mysql/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta!

 

Para saber quem é filho de quem, utilizo o ordination, ou seja, caso o pai seja "10501", seus filhos serão: "1050101", "1050102", etc. Se o pai for o "1050101", seus filhos serão "1050101001", "1050101002", etc.

 

Entendi a parte para fazer a extração e criar um array novo para cada nível. Eu teria que comparar os prefixos do ordination (10501 ou 1050101) para saber onde colocar os filhos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Claudia França
      Pessoal estou com um problema para homologar um pagamento service.
       o resultado do Status deve ser sucessfull.
      Parte do codido do index.
      "

          $('#payButton').one('click', function(){
              var amount = $('input[name=amount]').val();
              var currency = $('[name=currency]').val();
              console.log(amount, currency);
              V.init( {
                  apikey: '<?php echo $visaApiKey ?>',
                  settings: {
                      //logoUrl: 'https://www.novachance.org.br/wp-content/uploads/2018/06/xLogo_INC.jpg.pagespeed.ic.QrM-Azm3n5.jpg',
                      locale: 'en_US',
                      displayName: 'Viva a Musica',
                      websiteUrl: 'https://www.vivaamusica.org.br',
                      customerSupportUrl: 'https://www.vivaamusica.org.br/contato',
                      dataLevel: 'FULL'
                  },
                  paymentRequest: {
                      currencyCode: currency,
                      total: amount,
                      merchantRequestId: 'you can send any value to API ang get it in callback',
                      orderId: 'you can send any value to API ang get it in callback',
                      description: 'any order description if needs'
                  }
              });
                V.on('payment.success', function(payment) {
                  console.log('Visa success:', JSON.stringify(payment));
                  $('#succesOverlay').show();
                  $.ajax({
                      type: 'POST',
                      url: 'mailer.php',
                      data: {json: JSON.stringify(payment)},
                      dataType: 'json',
                      success: function(data){
                        console.log('Ajax success');
                        console.log(data);
                        location = 'thanks.php';
                      },
                      error: function(jqXHR, textStatus, errorThrown) {
                        console.log('Ajax error:');
                        console.log(textStatus, errorThrown);
                      }
                  });
              });
              V.on('payment.cancel', function(payment){
                  console.log('Canceled:', payment);
              });
              V.on('payment.error', function(payment, error){
                  console.log('Visa error:', payment, error);
              });
              $('.v-button').click();
          })
       
      "
       Chamada Json
       
      "
      "Customer": {
              "Name": "[$userFullName]"
          },
          "Payment": {
              "ServiceTaxAmount": 0,
              "Installments": 1,
              "Interest": 0,
              "Capture": false,
              "Authenticate": false,
              "Recurrent": false,
              "CreditCard": {
                  "CardNumber": "453211******1521",
                  "Holder": "Gama Gama",
                  "ExpirationDate": "08/2020",
                  "SaveCard": false,
                  "Brand": "Visa"
              },
              "Tid": "0319040817883",
              "ProofOfSale": "817883",
              "AuthorizationCode": "027795",
              "Wallet": {
                  "Type": "VisaCheckout",
                  "WalletKey": "1140814777695873901",
                  "Eci": 0
                  },
              
              "SoftDescriptor": "123456789ABCD",
              "Amount": 100,
              "ReceivedDate": "2018-03-19 16:08:16",
              "Status": "eventStatus",
              "IsSplitted": false,
              "ReturnMessage": "Operation Successful",
              "ReturnCode": "4",
              "PaymentId": "e57b09eb-475b-44b6-ac71-01b9b82f2491",
              "Type": "CreditCard",
              "Currency": "BRL","en_US",
              "Country": "BRA","USA",
              
              
          
      "updateInfo":  {
               "payInfo": {
               "reason": "Pagamento","Payment",
               "avsResponseCode": "Y",
               "Amount": 91.00,
               "currencyCode": "USD",
               "eventStatus": "Success",
               "eventType": "Authorize",
               "PaymentId": "e57b09eb-475b-44b6-ac71-01b9b82f2491",
              
               }
      }
           
            }
      }
      {
       
       
      "
       
       
      O pessoal da empresa me fala que tenho que enviar o CallID gerado ( não sei como faço isso) e fazer a chamado do alteração de evento quando a transação for sucesso.
       
      Pensei em criar um aquivo payment.php mas pelo que li no manual necessariamente, não eh necessário.
       
    • Por edison.silva
      Pessoal, alguem tem algum exemplo em php de geração do arquivo .TXT2 da NFe ou MDFe e o envio para API de rotas dele?
    • Por eduuh1524
      Olá.
      Boa noite a todos,eu preciso de uma ajuda.
      Eu tenho um projeto em PHP e MySQL
      Tem uma database chamada easy e a uma tabela chamada usuários
      E dentro da tabela tem usuário,senha, saldo
       
      Bem.
      Eu tenho um random resultados em duas form na (resultados.php)eu queria fazer que quando a pessoa clicasse no botão Gerar usasse o saldo e gerasse o resultado.
      Exemplo,a pessoa já começa com 1000 de saldo e o botão diminui esse saldo em 100 e quando esse saldo chegasse em 0 se tentasse usar dá um erro de saldo insuficiente.
      Como posso fazer isso?
      Dei uma olhada em uns artigos aqui mas estou meio confuso,sou iniciante em PHP mas tenho uma noçãozinha .
      Boa noite a todos.
       
    • Por rd111072
      Olá, moçada!

      Tenho esse gráfico aqui: http://riocir.com.br/renan/chart_barg_g2.php 
      Mas ele exibe só os dias da semana do mês 1. Queria que ele exibisse todos os dias de todos os meses (como é o resultado do echo).

      Segue o código. Alguém pode me ajudar?
       
       
    • Por capaldi
      <?php
      if(isset($_GET['deletar']) && $_GET['deletar'] == 'sim'):
          $id_produto = (int)$_GET['produto'];
          $pegar_dados_produto = BD::conn()->prepare("SELECT img_padrao FROM loja_produtos WHERE id = ?");
          $pegar_dados_produto->execute(array($idProduto));
          $dadosProd = $pegar_dados_produto->fetchObject();
          
          $verificar_imagens = BD::conn()->prepare("SELECT * FROM loja_imgprod WHERE id_produto = ?");
          $verificar_imagens->execute(Array($idProduto));
          
          if($verificar_imagens->rowCount() == 0){
              if(unlink('../../produtos/'.$dadosProd->img_padrao)){
                  $deletar_produto =BD::conn()->prepare("DELETE FROM loja_produtos WHERE id = ?");
                  if($deletar_produto->execute(array($IdProduto))){
                      echo'<script>alert("Produto excluido com sucesso!");location.href"index.php?pagina=editarProdutos</script>';    
                  }
                  
              }
              
          }else{
              while($dadosImagenm = $verificar_imagens->fetchObject()){
                  unlink('../../produtos/'.$dadosImagem->img);
              }
              if(unlik('../../produtos/'.$dadosProd->img_padrao)){
                  $deletar_produto = BD::conn()->prepare("DELETE FROM loja_produtos WHERE id = ?");
                  if($deletar_produto->execute(array($idproduto))){
                      echo'<script>alert("Produto excluido com sucesso!");location.href"index.php?pagina=editarProdutos</script>';
                  }
              }
          }
      endif;
      ?>
       
      Ola, estou tabalhando com esse script, e não consigo resolver esse problema alguém pose me ajudar?
×

Informação importante

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