Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

Comparação entre 2 arrays (stdClass object e comum) é possível?

Recommended Posts

Galera,

 

Aqui estou na minha empreitada novamente com mais uma dúvida.

 

Tenho dois arrays. O primeiro corresponde a categorias disponíveis para uso, e o segundo corresponde as categorias já utilizadas.

 

Porém, estes arrays foram construidos de um jeito diferente do outro. E o que eu preciso é comparar os 2 arrays, e saber quais itens do array 01 foram usados no array 02.

 

Para fazer um if assim:

foreach($resultadoSecaoList as $secaoList) // * Desmembra o array de seções
{
    if(!essa seção já foi utilizada no array 02) // Aqui está o lance.
    {
        $listaSecao .= "Seção X disponível";
    }
}

 

Array 01: Categorias disponíveis

Array
(
    [0] => Array
        (
            [id] => 1
        )

    [1] => Array
        (
            [id] => 2
        )

    [2] => Array
        (
            [id] => 3
        )

    [3] => Array
        (
            [id] => 6
        )

    [4] => Array
        (
            [id] => 7
        )

    [5] => Array
        (
            [id] => 8
        )

    [6] => Array
        (
            [id] => 9
        )
)

 

Array 02: Categorias utilizadas

Array
(
    [0] => stdClass Object
        (
            [id] => 1
        )

    [1] => stdClass Object
        (
            [id] => 2
            [children] => Array
            (
                [0] => stdClass Object
                    (
                            [id] => 6
                    )
            )
        )

    [2] => stdClass Object
        (
            [id] => 3
        )

    [3] => stdClass Object
        (
            [id] => 7
        )
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utiliza o Array Diff man.

 

<?php
$array1 = array("a" => "verde", "vermelho", "azul", "vermelho");
$array2 = array("b" => "verde", "amarelo", "vermelho");
$result = array_diff($array1, $array2);
print_r($result);

 

http://php.net/array_diff

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Paulo,

 

Encontrei uma função que converte um array de objetos para um array comum. Ficou assim:

 

Array
(
    [0] => Array
        (
            [id] => 1
        )

    [1] => Array
        (
            [id] => 2
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 9
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 8
                        )

                )

        )

    [2] => Array
        (
            [id] => 3
        )

    [3] => Array
        (
            [id] => 7
        )

)

 

mas retornou em branco o array_diff():

 

$arraySecDisponiveis = array();
$arraySecUsadas = objectToArray($menuEstrutura);
										
foreach($resultadoSecaoList as $secaoList) // * Desmembra o array de seções
{
	$arraySecDisponiveis[]['id'] = $secaoList['secId'];
}

$resultComparacao = array_diff($arraySecDisponiveis, $arraySecUsadas);
print_r($resultComparacao);

 

O print_r retornou:

Array
(
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

precisa ter a mesma estrutura para comparar.

 

no seu caso, uma saída é interar o "array de objetos", e jogar os ids num novo array.. assim poderá fazer a comparação com array_diff.

 

mas penso que talvez tenha outro jeito eliminando o problema pela raíz.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @hinom, eu pensei em padronizar os arrays, mas não sei como posso.

  • O array que tem objetos na verdade é fruto de um json_decode($jsonString).
  • O segundo array eu posso manipular mais facilmente, mas não sei como deixar no mesmo padrão do primeiro. Eu pego estes itens em uma consulta do banco, logo, posso montar do jeito que preferir.
foreach($resultadoSecaoList as $secaoList)
{
	$arraySecDisponiveis[]['id'] = $secaoList['secId']; // Aqui estou montando o segundo array. Posso manipular do jeito que quiser aqui
}

Então, como posso deixar este array como o primeiro (ou seja, transformar o array comum em objetos)

Compartilhar este post


Link para o post
Compartilhar em outros sites

,..no #6

 

 

apenas corrigindo digitação: interar :seta: iterar

 

pode ser que exista algum outro jeito mas o que imagino que seja simples é iterar os properties do objeto stdclass e passar os ids para um novo array.

 

 

acho que ao invés de usar foreach, while,etc.. o array_walk_recursive() pode auxiliar.

 

http://php.net/array_walk_recursive

Compartilhar este post


Link para o post
Compartilhar em outros sites

@hinom descobri ao acaso outro jeito mais fácil de padronizar os arrays, o json_decode tem um atributo TRUE que transforma em array associativo, o que deixou os 2 arrays no mesmo padrão!

 

Porém, mesmo assim ainda não retorna as categorias faltantes:

 

// * array de categorias disponiveis
Array
(
    [0] => Array
        (
            [id] => 1
        )

    [1] => Array
        (
            [id] => 2
        )

    [2] => Array
        (
            [id] => 3
        )

    [3] => Array
        (
            [id] => 6
        )

    [4] => Array
        (
            [id] => 7
        )

    [5] => Array
        (
            [id] => 8
        )

    [6] => Array
        (
            [id] => 9
        )

)

// * array de categorias utilizadas
Array
(
    [0] => Array
        (
            [id] => 1
        )

    [1] => Array
        (
            [id] => 2
        )

    [2] => Array
        (
            [id] => 3
        )

    [3] => Array
        (
            [id] => 7
        )

)

// * array diff
Array
(
)

 

O array_diff não deveria retornar os IDs que não são comuns aos 2? No caso: ID 6,8 e 9?

Compartilhar este post


Link para o post
Compartilhar em outros sites

array_diff sozinho não resolverá..

 

precisa usar mais algumas funções.

 

aconselho a fazer outra conversão, removendo o objeto array cujo index é 'id', para ficar mais fácil trabalhar a comparação.

 

 

 

 

desmontar o multidimensional:

Array
(
    [0] => Array
        (
            [id] => 1
        )

 

para ficar assim, um simples array:

 

Array
(
    [0] => 1

 

assim ficará mais fácil trabalhr com as funções de comparação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz, vai ser um trampo fazer isso, o array_diff não suporta diversas dimensões? :/

 

O problema na real é que existem casos em que tenho mais dimensões... ex:

 

Array
(
    [0] => Array
        (
            [id] => 1
        )

    [1] => Array
        (
            [id] => 2
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 9
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 8
                        )

                )

        )

    [2] => Array
        (
            [id] => 3
        )

    [3] => Array
        (
            [id] => 7
        )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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