Como remover valores duplicados de uma matriz em PHP


Respostas:


251

Use array_unique () .

Exemplo:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)

20
@Ian -Note that array_unique() is not intended to work on multi dimensional arrays.
Peter Ajtai

18
O acima preservará as chaves dos elementos. Se você quer que eles re-indexados, além aplicar array_values: php.net/manual/en/function.array-values.php
CodeVirtuoso

3
Isso não funcionou para mim, por favor use: $array = array_unique($array, SORT_REGULAR);
iniravpatel

@PeterAjtai: Obrigado por destacar na seção de comentários. Isso economizou muito tempo para mim.
Nana Partykar 12/12

29

Usar array_values(array_unique($array));

array_unique: para matriz única array_values: para reindexar


1
+1 array_uniqueretorna um objeto com pares de chave e valor E array_valuesretorna apenas valores como uma matriz.
narainsagar

24
//Find duplicates 

$arr = array( 
    'unique', 
    'duplicate', 
    'distinct', 
    'justone', 
    'three3', 
    'duplicate', 
    'three3', 
    'three3', 
    'onlyone' 
);

$unique = array_unique($arr); 
$dupes = array_diff_key( $arr, $unique ); 
    // array( 5=>'duplicate', 6=>'three3' 7=>'three3' )

// count duplicates

array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 )

9

A única coisa que funcionou para mim é:

$array = array_unique($array, SORT_REGULAR);

Editar: SORT_REGULARmantém a mesma ordem da matriz original.


8
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}

5

às vezes array_unique()não é o caminho, se você deseja obter itens únicos E duplicados ...

$unique=array("","A1","","A2","","A1","");
$duplicated=array();

foreach($unique as $k=>$v) {

if( ($kt=array_search($v,$unique))!==false and $k!=$kt )
 { unset($unique[$kt]);  $duplicated[]=$v; }

}

sort($unique); // optional
sort($duplicated); // optional

resultados em

array ( 0 => '', 1 => 'A1', 2 => 'A2', ) /* $unique */

array ( 0 => '', 1 => '', 2 => '', 3 => 'A1', ) /* $duplicated */

3

Podemos criar esse tipo de matriz para usar esse último valor, que será atualizado para o valor da coluna ou da chave e obteremos um valor exclusivo da matriz ...

$array = array (1,3,4,2,1,7,4,9,7,5,9);
    $data=array();
    foreach($array as $value ){

        $data[$value]= $value;

    }

    array_keys($data);
    OR
    array_values($data);

2

explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));

Isso cuidará das associações de chaves e serializará as chaves para a nova matriz resultante :-)


1
Qual seria o efeito de explode("," $YOUR_ARRAY)quando $YOUR_ARRAYé array("1", "2", "3")?
precisa saber é o seguinte

@kiamlaluno - :) ea resposta é: Atenção: explode () espera o parâmetro 2 para ser string, array dado na ... na linha ....
Jesse Chisholm

@JesseChisholm Sim, esse era o ponto, mas ninguém percebeu o código, aparentemente.
kiamlaluno

2

Dependendo do tamanho da sua matriz, eu encontrei

$array = array_values( array_flip( array_flip( $array ) ) );

pode ser mais rápido que array_unique.


Mais informações sobre o que está acontecendo aqui e seria mais rápido com uma matriz maior ou menor.
Fi Horan

O flip duplo removerá valores duplicados, porque uma chave não pode existir duas vezes, caso contrário, ela será substituída. Se qualquer valor for duplicado e a matriz for invertida, a última ocorrência (presumo) será o valor da chave.
Goldentoa11

No PHP 7, notei que inverter uma matriz multidimensional mais de uma vez pode reordenar os elementos da matriz inesperadamente.
Josh Habdas

1

Essa é uma ótima maneira de fazer isso. Pode querer garantir que sua saída retorne novamente a uma matriz. Agora você está apenas mostrando o último valor exclusivo.

Tente o seguinte:

$arrDuplicate = array ("","",1,3,"",5);

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);

1
    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

            <?php } endwhile; wp_reset_query(); ?>

verificar pela primeira vez o valor na matriz e encontrou o mesmo valor, ignore-o


1

Remova valores duplicados de uma matriz associativa no PHP.

$arrDup = Array ('0' => 'aaa-aaa' , 'SKU' => 'aaa-aaa' , '1' => '12/1/1' , 'date' => '12/1/1' , '2' => '1.15' , 'cost' => '1.15' );

foreach($arrDup as $k =>  $v){
  if(!( isset ($hold[$v])))
      $hold[$v]=1;
  else
      unset($arrDup[$k]);
}

Matriz ([0] => aaa-aaa [1] => 1/12/1 [2] => 1,15)


1

Pode haver várias maneiras de fazer isso, que são as seguintes

//first method
$filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));

//second method
$array = array_unique($arr, SORT_REGULAR);

1

Se você se preocupa com desempenho e possui uma matriz simples, use:

array_keys(array_flip($array));

É muitas vezes mais rápido que o array_unique.


1
$a = array(1, 2, 3, 4); 
$b = array(1, 6, 5, 2, 9); 
$c = array_merge($a, $b);
$unique = array_keys(array_flip($c));
print_r($unique);

A maneira mais rápida de conseguir isso é usar a função array_flip embutida no PHP [1]. array_flip trocará os valores da matriz com suas chaves e, como uma matriz não pode ter chaves duplicadas, você terminará com um conjunto exclusivo de chaves que correspondem aos valores da matriz original. Para recuperar essas chaves como valores, você pode usar a função array_keys para recuperar seus valores exclusivos. Tanto array_flip quanto array_keys são as funções O (n) de pior caso, enquanto array_unique tem o pior caso de O (n log (n)). [2]
Pawan Kumar

1
Por favor, adicione mais explicações à sua resposta (não à seção de comentários!). Como o código fornecido remove valores duplicados de uma única matriz? Por que você precisa de duas matrizes para isso?
Nico Haase

Bem-vindo ao StackOverflow! Vejo que você adicionou alguma explicação nos comentários da sua resposta. Seria útil se você adicionar essas informações como parte da própria resposta.
N4m31ess_c0d3r 10/04/19

Parece mais razoável adicionar esse comentário como uma edição à resposta já existente há muito tempo ( stackoverflow.com/a/52591730/2109067 ).
Ankhzet

Você pode usar uma matriz única com elementos duplicados. Eu tive problema de obter valores de duas matrizes em um e remover duplicatas.
Pawan Kumar

0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);

1
Isso realmente não explica nada e não parece ser "mais inteligente".
Sven

Você sempre pode explicar por que, editando sua própria postagem, basta clicar no link "editar" no final da sua resposta. Também sugiro que você dê uma olhada nas perguntas frequentes: stackoverflow.com/faq
ForceMagic 6/12

0
function arrayUnique($myArray)
{
    $newArray = Array();
    if (is_array($myArray))
    {
        foreach($myArray as $key=>$val)
        {
            if (is_array($val))
            {
                $val2 = arrayUnique($val);
            }
            else
            {
                $val2 = $val;
                $newArray=array_unique($myArray);
                $newArray=deleteEmpty($newArray);
                break;
            }
            if (!empty($val2))
            {
                $newArray[$key] = $val2;
            }
        }
    }
    return ($newArray);
}

function deleteEmpty($myArray)
{
    $retArray= Array();
    foreach($myArray as $key=>$val)
    {
        if (($key<>"") && ($val<>""))
        {
            $retArray[$key] = $val;
        }
    }
    return $retArray;
}

0

tente este código curto e agradável -

$array = array (1,4,2,1,7,4,9,7,5,9);
$unique = array();

foreach($array as $v){
  isset($k[$v]) || ($k[$v]=1) && $unique[] = $v;
  }

var_dump($unique);

Resultado -

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}

1
Abusar operadores booleanos para controlar o fluxo como este é desnecessariamente confuso. Apenas use if.
Mark Amery

0
<?php
$arr1 = [1,1,2,3,4,5,6,3,1,3,5,3,20];    
print_r(arr_unique($arr1));


function arr_unique($arr) {
  sort($arr);
  $curr = $arr[0];
  $uni_arr[] = $arr[0];
  for($i=0; $i<count($arr);$i++){
      if($curr != $arr[$i]) {
        $uni_arr[] = $arr[$i];
        $curr = $arr[$i];
      }
  }
  return $uni_arr;
}

Colocando count ($ arr) no circuito é bastante lento
Kiruahxh

0

Aqui eu criei uma segunda matriz vazia e usei o forloop com a primeira matriz que está tendo duplicatas. Ele será executado quantas vezes a contagem da primeira matriz. Em seguida, comparado com a posição da matriz com a primeira matriz e correspondendo ao fato de ele já possuir ou não esse item usando in_array. Caso contrário, ele adicionará esse item à segunda matriz com array_push.

$a = array(1,2,3,1,3,4,5);
$count = count($a);
$b = [];
for($i=0; $i<$count; $i++){
    if(!in_array($a[$i], $b)){
        array_push($b, $a[$i]);
    }
}
print_r ($b);

Você pode compartilhar alguma explicação sobre esse código? Por exemplo, por que você não usa um foreachloop?
Nico Haase

Esta é uma forma de fazer e porque eu não usei foreachporque estou muito confortável com o loop for. É isso aí.
Aladin Banwal

No entanto, você deve compartilhar algumas explicações com o código. Postar essas respostas no SO não é um bom estilo: as pessoas com o mesmo problema do OP podem aparecer e devem entender como o código resolve o problema, para que possam aprender com ele e adotá-lo de acordo com suas necessidades
Nico Haase

0

Isso pode ser feito através da função que eu fiz três funções duplicadas retorna os valores que são duplicados na matriz.

A segunda função única retorna apenas os valores que são únicos médios não repetidos na matriz e a terceira e a função completa retornam todos os valores, mas não duplicados, se qualquer valor for duplicado;

function duplicate($arr) {
    $duplicate;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] > 1) {
            $duplicate[$value] = $value;
        }
    }
    return $duplicate;
}
function single($arr) {
    $single;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] == 1) {
            $single[$value] = $value;
        }
    }
    return $single;
}
function full($arr, $arry) {
    $full = $arr + $arry;
    sort($full);
    return $full;
}

0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

// Deleting the duplicate items
$result = array_unique($array);
print_r($result);

ref: Demo


1
Qual é o sentido de responder a essa pergunta com array_unique 11 anos após a resposta original, que é exatamente isso?
Dylan Kas

0

Uma alternativa para a função array_unique () ..

Usando o algoritmo de força bruta

// [1] Esta é a nossa matriz com itens duplicados

$ correspondências = ["jorge", "melvin", "chelsy", "melvin", "jorge", "smith"];

// [2] Contêiner para a nova matriz sem itens duplicados

$ arr = [];

// [3] obtém o comprimento da matriz duplicada e define-a como var len a ser usada no loop for

$ len = count ($ correspondências);

// [4] Se corresponde à chave de matriz ($ i), a iteração do loop atual não está disponível em // [4] a matriz $ arr empurra o valor atual da chave de iteração das correspondências [$ i] // [4] para a matriz arr.

para ($ i = 0; $ i if(array_search($matches[$i], $arr) === false){ array_push($arr,$matches[$i]); } } //print the array $arr. print_r($arr); //Result: Array ( [0] => jorge [1] => melvin [2] => chelsy [3] => smith )


-2

Eu fiz isso sem usar nenhuma função.

$arr = array("1", "2", "3", "4", "5", "4", "2", "1");

$len = count($arr);
for ($i = 0; $i < $len; $i++) {
  $temp = $arr[$i];
  $j = $i;
  for ($k = 0; $k < $len; $k++) {
    if ($k != $j) {
      if ($temp == $arr[$k]) {
        echo $temp."<br>";
        $arr[$k]=" ";
      }
    }
  }
}

for ($i = 0; $i < $len; $i++) {
  echo $arr[$i] . " <br><br>";
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.