PHPで配列から重複する値を削除する方法


回答:


251

array_unique()を使用します。

例:

$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.
ピーターAjtai

18
上記は要素のキーを保持します。それらのインデックスを再作成したい場合は、さらにarray_valuesを適用します:php.net/manual/en/function.array-values.php
CodeVirtuoso

3
これは私にとっては$array = array_unique($array, SORT_REGULAR);
うまくいき

@PeterAjtai:コメントセクションで強調表示していただきありがとうございます。それは私にとって多くの時間を節約しました。
Nana Partykar 2018

29

使用する array_values(array_unique($array));

array_unique:一意の配列の場合 array_values:再インデックスの場合


1
+1 array_uniqueは、キーと値のペアを持つオブジェクトを返し、値array_valuesのみを配列として返します。
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

私のために働いた唯一のものは:

$array = array_unique($array, SORT_REGULAR);

編集:SORT_REGULAR元の配列と同じ順序を維持します。



5

array_unique()あなたがユニークで重複したアイテムを取得したい場合は、時にはそうではありません...

$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

上の結果

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

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

3

このようなタイプの配列を作成して、この最後の値を列またはキーの値に更新し、配列から一意の値を取得することができます...

$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))));

これはキーの関連付けを処理し、結果の新しい配列のキーをシリアル化します:-)


1
explode("," $YOUR_ARRAY)いつの影響$YOUR_ARRAYarray("1", "2", "3")何ですか?
kiamlaluno 2010

@kiamlaluno-:)と答えは次のとおりです。警告:
Jesse Chisholm

@JesseChisholmはい、これがポイントでしたが、どうやら誰もコードに気づきませんでした。
kiamlaluno 2015

2

あなたのアレイのサイズに応じて、私は見つけました

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

array_uniqueよりも高速です。


ここで何が行われているのかについての詳細はありますか?
Fi Horan

キーが2回存在することはできないため、二重反転により重複した値が削除されます。それ以外の場合、キーは上書きされます。値が重複していて配列が反転している場合、最後に発生したもの(私はそう思います)がキーの値になります。
Goldentoa11 2017年

PHP 7では、多次元配列を2回以上フリップすると、配列要素が予期せずに並べ替えられる場合があります。
Josh Habdas 2017年

1

それはそれを行うための素晴らしい方法です。その出力が配列に戻っていることを確認したい場合があります。これで、最後の一意の値のみが表示されます。

これを試して:

$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(); ?>

配列の値を初めて確認し、同じ値が見つかったので無視します


1

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]);
}

配列([0] => aaa-aaa [1] => 12/1/1 [2] => 1.15)


1

これらを行うには、次のような複数の方法があります。

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

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

1

パフォーマンスに関心があり、配列が単純な場合は、次のようにします。

array_keys(array_flip($array));

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);

これを実現する最も速い方法は、PHP [1]に組み込まれているarray_flip関数を使用することです。array_flipは配列の値をキーと入れ替えます。配列は重複するキーを持つことができないので、元の配列の値に対応する一意のキーのセットになってしまいます。これらのキーを値として取得するには、array_keys関数を使用して一意の値を取得できます。array_flipとarray_keysはどちらもワーストケースのO(n)関数ですが、array_uniqueはワーストケースのO(n log(n))です。[2]
pawan kumar

1
(コメントセクションではなく)回答に説明を追加してください。与えられたコードはどのようにして単一の配列から重複した値を削除しますか?なぜ2つの配列が必要なのですか?
Nico Haase

StackOverflowへようこそ!回答のコメントに説明を追加しているようですが、回答自体の一部としてこの情報を追加すると参考になります。
n4m31ess_c0d3r

そのコメントを既存の回答(stackoverflow.com/a/52591730/2109067)の編集として追加する方が合理的だと思われます。
アンクゼット

重複する要素を持つ単一の配列を使用できます。2つの配列から1つの値を取得して、重複を削除するという問題がありました。
pawan kumar

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

1
これは実際には何も説明せず、「賢い」とは思われません。
スヴェン

自分の投稿を編集することで、理由をいつでも説明できます。回答の最後にある「編集」リンクをクリックするだけです。また、FAQを
ご覧になる

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

この短くて甘いコードを試してください-

$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);

出力-

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

1
このような制御フローでブール演算子を悪用すると、不必要に混乱することになります。だけを使用してくださいif
Mark Amery 2015

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;
}

count($ arr)をループに
入れるの

0

ここでは、2番目の空の配列を作成し、for重複している最初の配列でループを使用しました。最初の配列の数と同じ回数だけ実行されます。次に、配列の位置と最初の配列を比較し、を使用して、この項目がすでにあるかどうかを照合しましたin_array。そうでない場合は、その項目をで2番目の配列に追加します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);

そのコードについての説明を教えてください。たとえば、foreachループを使用してみませんか?
Nico Haase

これは一種の実行方法でありforeach、forループに非常に慣れているので使用しなかった理由です。それでおしまい。
Aladin Banwal

それにもかかわらず、コードといくつかの説明を共有する必要があります。SO上、このような答えを投稿する良いスタイルではありません:OPと同じ問題を持つ人々が一緒に来ることができ、彼らはあなたのコードは、彼らがそれから学び、自分のニーズにそれを採用することができるように、問題を解決する方法を理解することができるはず
ニコハセ

0

これは、3つの関数duplicateが配列で重複する値を返すようにした関数を介して実行できます。

2番目の関数singleは、配列内で繰り返されない単一の意味である値のみを返し、3番目と完全な関数はすべての値を返しますが、値が重複している場合は複製されず、単一に変換します。

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:デモ


1
元の答えである11年後のarray_uniqueでこの質問に答える意味は何ですか?
ディランカス

0

array_unique()関数の代替。

ブルートフォースアルゴリズムの使用

// [1]これは、重複したアイテムを含む配列

$ matches = ["jorge"、 "melvin"、 "chelsy"、 "melvin"、 "jorge"、 "smith"];

// [2]重複するアイテムのない新しい配列のコンテナ

$ arr = [];

// [3]複製された配列の長さを取得し、forループに使用する変数lenに設定します

$ len = count($ matches);

// [4]配列key($ i)に一致する場合現在のループ反復は使用できません // [4]配列$ arrは、一致の現在の反復キー値をプッシュします[$ i] // [4]を配列arrに。

for($ 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

私は関数を使用せずにこれを行いました。

$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>";
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.