Como posso remover valores duplicados de uma matriz multidimensional no PHP?
Matriz de exemplo:
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
[3] => Array
(
[0] => abc
[1] => def
)
[4] => Array
(
[0] => ghi
[1] => jkl
)
[5] => Array
(
[0] => mno
[1] => pql
)
)
php
arrays
duplicate-data
Ian
fonte
fonte
serialize(array('a' => '1', 'b' => '1'))
é diferente deserialize(array('b' => '1', 'a' => '1'))
. Esta opção falhará nas matrizes usadas comosets
ou(hash)maps
.Desde 5.2.9, você pode usar
array_unique()
se usar oSORT_REGULAR
sinalizador da seguinte maneira:Isso faz com que a função compare elementos para igualdade como se
$a == $b
estivesse sendo usada, o que é perfeito para o seu caso.Resultado
Porém, lembre-se de que a documentação declara:
fonte
Eu tive um problema semelhante, mas encontrei uma solução 100% funcional para ele.
fonte
Outra maneira. Também preservará as chaves.
fonte
Os comentários do usuário na documentação do array_unique () têm muitas soluções para isso. Aqui está um deles:
Isto é de http://ca3.php.net/manual/en/function.array-unique.php#57202 .
fonte
Se "remover duplicados" significa "remover duplicados, mas deixe um lá", uma solução pode ser aplicar
array_unique(...)
primeiro a "coluna identificadora" e depois remover na matriz original todas as chaves que foram removidas da matriz de colunas :O resultado é:
fonte
Isso removerá os nomes duplicados da matriz. único por chave
fonte
$array
as teclas começam em "0". É possível que$array
as teclas comecem com outro número se$array
for o resultado de uma manipulação anterior da matriz. Usearray_values
para redefinir as teclas de volta para "0"Solução simples:
fonte
Basta usar a opção SORT_REGULAR como segundo parâmetro.
fonte
se você precisar eliminar duplicatas em chaves específicas, como um ID mysqli, aqui está uma função simples
Pontos de bônus Você pode passar uma matriz de chaves e adicionar um foreach externo, mas será 2x mais lento por chave adicional.
fonte
Uma maneira muito fácil e lógica de criar uma matriz multidimensional exclusiva é a seguinte,
Se você tiver um array como este:
use
foreach
para resolver isso:isso lhe dará o seguinte resultado:
e se você deseja reorganizar a ordem das teclas,
Esta operação fornecerá valores-chave organizados como este:
Espero que isso esclareça tudo.
fonte
se você tiver uma matriz como esta:
(users é o nome da matriz)
e você deseja excluir duplicatas ... então:
pode ser uma solução: P
fonte
Uma solução de fácil leitura, provavelmente não a mais eficiente:
fonte
Como as pessoas estão dizendo
array_unique()
é muito lento, aqui está um trecho que eu uso para uma matriz multidimensional de nível.Referência ao primeiro usuário contribuiu com a nota da página de
array_unique()
funções no php.netfonte
$output = array_map('unserialize', array_keys($result));
Muita pessoa me perguntou como criar um array multidimensional exclusivo. Tomei referência do seu comentário e isso me ajuda.
Antes de tudo, obrigado a @jeromegamez @daveilers por sua solução. Mas toda vez que eu dava a resposta, eles me perguntavam como esse 'serializar' e 'desserializar' funciona. É por isso que quero compartilhar o motivo disso com você, para que ajude mais pessoas a entender o conceito por trás disso.
Estou explicando por que usamos 'serialize' e 'unserialize' nas etapas:
Etapa 1: Converter a matriz multidimensional em matriz unidimensional
Para converter a matriz multidimensional em uma matriz unidimensional, primeiro gere representação de fluxo de bytes de todos os elementos (incluindo matrizes aninhadas) dentro da matriz. A função serialize () pode gerar representação de fluxo de bytes de um valor. Para gerar a representação do fluxo de bytes de todos os elementos, chame a função serialize () dentro da função array_map () como uma função de retorno de chamada. O resultado será uma matriz unidimensional, independentemente de quantos níveis a matriz multidimensional possua.
Etapa 2: Tornar os valores exclusivos
Para tornar essa matriz unidimensional exclusiva, use a função array_unique ().
Etapa 3: reverta-o para a matriz multidimensional
Embora a matriz agora seja única, os valores parecem representação de fluxo de bytes. Para reverter para a matriz multidimensional, use a função unserialize ().
Mais uma vez obrigado por tudo isso.
fonte
Uma alternativa para serializar e único
* /
fonte
Se você tem uma matriz como esta
e você deseja obter matrizes assim:
ou
um código a seguir pode ajudar
fonte
Pensei bastante neste problema e determinei que a solução ideal deveria seguir duas regras.
Com isso em mente e considerando todas as peculiaridades do PHP, abaixo está a solução que eu criei. Ao contrário de algumas das outras respostas, ele tem a capacidade de remover elementos com base nas chaves que você deseja. Espera-se que a matriz de entrada seja teclas numéricas.
A única desvantagem é que as chaves não estão em ordem quando a iteração é concluída. Isso não é um problema se você estiver usando posteriormente apenas loops foreach, mas se precisar usar um loop for, poderá colocar
$input = array_values($input);
o que foi dito acima para renumerar as chaves.fonte
Com base na resposta marcada como correta, adicionando minha resposta. Código pequeno adicionado apenas para redefinir os índices -
fonte