Como remover valores duplicados de uma matriz em PHP

155

Como posso remover valores duplicados de uma matriz no PHP?

Ian
fonte

Respostas:

251

Use array_unique () .

Exemplo:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
Jeremy Ruten
fonte
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

nimey sara thomas
fonte
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 )
chim
fonte
9

A única coisa que funcionou para mim é:

$array = array_unique($array, SORT_REGULAR);

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

iniravpatel
fonte
8
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}
Amr Berag
fonte
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 */
AgelessEssence
fonte
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);
áspero kumar
fonte
2

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

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

Deb
fonte
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.

Bollis
fonte
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);
Seca B
fonte
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

Alpesh Navadiya
fonte
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)

Shivivanand
fonte
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);
Shahrukh Anwar
fonte
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.

michal.jakubeczy
fonte
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);
pawan kumar
fonte
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);
user1045247
fonte
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;
}
Vineesh Kalarickal
fonte
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)
}
Rohit Suthar
fonte
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;
}
sumityadavbadli
fonte
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);
Aladin Banwal
fonte
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;
}
Mirza Obaid
fonte
0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

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

ref: Demo

nageen nayak
fonte
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 )

Richard Ramos
fonte
-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>";
}
Ashishdmc4
fonte