PHPで重複した配列の削除方法

このQ&Aのポイント
  • PHPで重複した配列の値を削除する方法について教えてください。
  • 配列の値が必ずしも同じ位置に存在しない場合、どのように重複を削除することができるのか知りたいです。
  • 提供された配列の例を使用して、重複した値を削除して新しい配列を作成する方法を教えてください。
回答を見る
  • ベストアンサー

php 重複した配列の削除

重複する配列を削除した結果を取得したいのですがうまくいきません。 値が必ずしも同様の位置にセットされていないため重複削除ができずに困っております。 Array ( [0] => tag1 [1] => tag4 [2] => tag2 [3] => tag3 ) Array ( [0] => tag4 [1] => tag3 [2] => tag2 [3] => tag1 ) Array ( [0] => tag5 [1] => tag6 ) 上記の重複した値を削除して、下記のように処理したいのですが、、、 Array ( [0] => tag1 [1] => tag4 [2] => tag2 [3] => tag3 ) Array ( [0] => tag5 [1] => tag6 ) 宜しくお願い致します。

  • yh8td
  • お礼率40% (2/5)
  • PHP
  • 回答数5
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

別解です <?PHP $a=Array( Array('tag1','tag4','tag2','tag3') ,Array('tag1','tag2') ,Array('tag4','tag3','tag2','tag1') ,Array('tag2','tag1') ,Array('tag4','tag3','tag2','tag2') ,Array('tag3','tag2','tag4','tag1') ,Array('tag5','tag6') ); for($i=0;$i<count($a);$i++){ for($j=count($a)-1;$j>$i;$j--){ $x=$a[$i];sort($x); $y=$a[$j];sort($y); if($x==$y){ unset($a[$j]); $a=array_merge($a); } } } print_r($a); ?> ロジック的には、二つの配列をソートした状態でくらべて 一致したら削除してつめていくという感じです

yh8td
質問者

お礼

ありがとうございます。思い通りの値を取得できました。とても助かりました!

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

array_diffはやめた方がいい 要素がユニークであるという保証がなければ、違う配列でも カウント数は0になりうる。 <?PHP print count(array_diff(array('tag1','tag1','tag2'),array('tag1','tag2'))); ?>

yh8td
質問者

お礼

ありがとうございます。参考にさせて頂きます!

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.4

ご参考まで。 配列の差を取得する関数 array_diff() がありますよ。 count( array_diff($array1,$array2)) が 0 なら「要素は同じ配列」と判定可。 http://jp2.php.net/manual/ja/function.array-diff.php

  • petita
  • ベストアンサー率53% (8/15)
回答No.3

$array=array( Array('tag1','tag4','tag2','tag3'), Array('tag4','tag3','tag2','tag1'), Array('tag5','tag6') ); $tmp=array(); for($i=0;$i<count($array);$i++){ for($j=0;$j<count($array[$i]);$j++){ if(in_array($array[$i][$j],$tmp)){ array_splice($array[$i],$j,1); $j--; continue; } $tmp[]=$array[$i][$j]; } }

回答No.1

こんなんでいかがでしょうか。 $arr = Array( Array ( 'tag1', 'tag4', 'tag2', 'tag3' ) , Array ( 'tag4', 'tag3', 'tag2', 'tag1' ) , Array ( 'tag5', 'tag6' ) ); $uniq = Array(); $check = Array(); foreach ($arr as $ar) { $ar_st = array_merge(Array(), $ar); sort($ar_st); $c_key = implode(".", $ar_st); if (!array_key_exists($c_key, $check)) { $check[$c_key] = 1; $uniq[] = $ar; } } print_r($uniq); 結果は次のようになります。 Array ( [0] => Array ( [0] => tag1 [1] => tag4 [2] => tag2 [3] => tag3 ) [1] => Array ( [0] => tag5 [1] => tag6 ) )

関連するQ&A

  • 多次元配列の重複削除

    PHPの多次元配列の重複削除で悩んでいます・・・。 例) array(4) { [0]=> array(2) { ["name"]=>string(10) "春" ["cool"]=>int(0) } [1]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(200) } [2]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(0) } [3]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(200) } } 上記のような配列があった場合 下記のように重複してるものを削除させたいのです・・・。 array(4) { [0]=> array(2) { ["name"]=>string(10) "春" ["cool"]=>int(0) } [1]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(200) } [2]=> array(2) { ["name"]=>string(14) "冬" ["cool"]=>int(0) } } array_unique($array)を使用してもうまく行かず 悩んでおります。。。。 よい方法等あればご教授お願いいたします。

    • ベストアンサー
    • PHP
  • 配列の重複削除について

    配列の重複削除について教えて下さい。 普通の重複チェックとは違い、3つの配列 それぞれに値があり、添え字が0から同じ ように始まり、3つの配列が全て同じものは、 例えば、 配列A[2]='30' 配列B[2]='000' 配列C[2]='1' 配列A[4]='30' 配列B[4]='000' 配列C[4]='1' は、1つの添え字にまとめたい。 その3つが一致したもの重複をまとめたいのと、 新しく出た3つの値は残したいのです。 つまり、以下のように抽出したいのです。 何か良い方法があれば教えて下さい。 perlで作成しています。 注)配列Cは空白もあります。 配列A( 10, 20, 30, 10, 30, 20) 配列B(000,010,000,010,000,000) 配列C(  , 0, 1, 0, 1, 1) ↓ 配列D( 10, 20, 30, 10, 20) 配列E(000,010,000,010,000) 配列F(  , 0, 1, 0, 1)

    • ベストアンサー
    • Perl
  • 空の配列を削除して、詰めていく。

    データベースから値を取ってくるとき、全て、同じ値が入ってくる場合があります。 $a = array(100,100,100,100,100)というような。 これを、array_uniqueで重複している値を削除したのですが、その際、print_rで見ると、 Array ( [4] => 100 ) と表示されました。つまり、キーが0ではなく、4となってしまっています。 array_uniqueで帰ってきた値が複数なら、さらにsortすることで0から始まる配列として並び替えられるのですが、1つしか帰ってこないとsortをしても、キーは変わらないようです。 この値を表示させるとき、countで配列の数を数え、さらにfor文でcountの数だけ回し、print $i;で表示させるようにしているのですが、上記のようにarray_uniqueで1つの値しか帰ってこないと、ページに値がきちんと表示できなくなってしまいます。 これを解決するために、空の要素を削除して、空白でない要素のキーを前に詰めてくれるような関数などを探しているのですが、何か方法などありますでしょうか? Array ( [4] => 100 ) が Array ( [0] => 100 )となるようにしたいのです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • php 配列の並べ替え

    言語はphpなのですが以下のような配列があるとします。 $array = array( 1, 2, 3, 4, 5, 6, ... ); 上記を下記のような配列にしたいです。 $array2 = array( array( 1, 5, 9 ), array( 2, 6, 10 ), array( 3, 7, 11 ), array( 4, 8, 12 ) ); また、以下のように値が増減する可能性もあります。 $array2 = array( array( 1, 5, 9 ), array( 2, 6, 10 ), array( 3, 7 ), array( 4, 8 ) ); ご教授ください。

    • ベストアンサー
    • PHP
  • 配列にある重複要素を削除したい(VBA)

    エクセルVBAにて、あるルールで対象となるセルの値を配列に格納しております。 配列の要素には重複しているものもあるため、重複要素を配列から削除したいのですが その方法が分かりません。 どなたか、よろしくご教授下さい。

  • PHP 配列

    多重の質問申し訳ございません。現在配列をvar_dumpすると array(3) { [0]=> string(32) "hogehoge" [1]=> string(32) "pipyup4646" [2]=> string(9) "1000%" } array(3) { [0]=> string(32) "testtest" [1]=> string(32) "kodsaf45454” [2]=> string(9) "500%" } prinfをしましたら出力結果が array(英語,英数字,値); という形になっているみたいです。 これを[英語][英数字] = 値というのは可能でしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • [PHP]配列におけるインデックスの考え方

    $scores = [10, 50, 30, 20]と言った配列があるとします。 配列内の10の値を取りだそうとすれば print $scores[0]; とすればブラウザに10の値が表示されます。 というか、配列というのは、[0][1][2][3]…と数えるものだと思っていました。 今、array_fill()関数について学習しています。 $prices = array_fill(0, 5, 10); としてprint_rで出力すると Array ( [0] => 10 [1] => 10 [2] => 10 [3] => 10 [4] => 10 ) と自分で理解できる範囲の結果が表示されます。 ところが、 $prices = array_fill(-2, 5, 10); をprint_rで出力すると以下のように返ってきます。 Array ( [-2] => 10 [0] => 10 [1] => 10 [2] => 10 [3] => 10 ) 単純に考えると、以下のように返ってこないのはなぜなのでしょうか? Array ( [-2] => 10 [-1] => 10 [0] => 10 [1] => 10 [2] => 10 ) また $prices = array_fill(5, 5, 10); と記述すると、 Array ( [5] => 10 [6] => 10 [7] => 10 [8] => 10 [9] => 10 ) と返ってきます。 配列のインデックス、添字を名前や商品名にして連想配列が出来るのはわかります。 (1)マイナス値からはじめた場合、なぜ[-2][-1][0]…のように返ってこないのはなぜでしょうか? (2)配列の添え字、インデックスが、[5]ではじまり[6][7][9][10]…とすることに 何か意味があるのでしょうか? $prices = [10, 10, 10, 10, 10]のような記述があった場合、初学者には[0]からはじまっているからこそ array_spliceなどでキー名がわからずとも、配列を操作を容易にできるのではないかと思ってしまいます。 上記2点、配列内でのマイナス値の扱い方、配列の添字が[0]以外からはじまる理由がよくわかりません。 分かる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの配列

    配列操作で行き詰まったため質問させて頂きます。 ( [0] => Array ( [order] => 39 [time] => 16 ) [1] => Array ( [time] => 17 ) [2] => Array ( [time] => 18 ) [3] => Array ( [time] => 19 ) [4] => Array ( [order] => 39 [time] => 20 ) [5] => Array ( [time] => 21 ) ) 上記のように格納されている配列を下記のように縮めたいと考えています。 ( [0] => Array ( [order] => 39 [time] => 16 ) [1] => Array ( [time] => 17-19 ) [2] => Array ( [order] => 39 [time] => 20 ) [3] => Array ( [time] => 21 ) ) 要は、[order]が無く[time]が2個以上続いている場合、始めの[time]+[-]+最後の[time](order一個手前の)のようにしたいのですが、どのようにすれば良いのか色々考えたのですが行き詰ってしまいました。 どなたかどのようなコードを書けば良いか教えて頂けないでしょうか。 ※始めの配列の並びは例です、毎回配列の中身は違います、もちろん全部[order]が入っている場合もありますし、全部[time]の場合もあります。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 配列の比較

    下記のような配列が二つあります。 1 $array1 = Array ( [0] => 20 [1] => 22 ) 2 $array2 = Array ( [0] => 20 [1] => 22 [2] => 18 [3] => 19 ) array_intersect関数を使い、 この配列を比較して、重複している値を取り出したいのですが、 どうしてもできません。 $intersect = array_intersect($array1,$array2); print_r($intersect); としましたが、だめです。根本的な構造が違うのか? または他の方法があるのか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • PHP多次元配列で重複チェック

    現在重複チェックのプログラムを制作中です。 各配列には400文字程度の文章で、75個あります。 条件文でのチェックを行うと通り数で2800通りになるので array_count_values 関数 を使おうと思っているのですが 多次元配列にして、ラベル(bunsyou1~bunsyou75)と文章を一組にして、 ラベルで重複箇所を結果として出す方法は在りますでしょうか? ご教示いただければ幸いです。

    • ベストアンサー
    • PHP

専門家に質問してみよう