PHPで重複しているKeyを列挙する方法

このQ&Aのポイント
  • PHPの配列で同一の値をもつKeyを列挙する方法について説明します。
  • array_uniqueを使用すると重複した値を排除することができますが、重複しているKeyを列挙したい場合はどうすれば良いでしょうか?
  • 例えば、東京が重複しているKeyは住所1と住所2であり、大阪が重複しているKeyは住所3と住所4です。このような重複しているKeyを表示する方法を紹介します。
回答を見る
  • ベストアンサー

PHPで配列で同一の値をもつKeyを列挙する

$list["住所1"]="東京"; $list["住所2"]="東京"; $list["住所3"]="大阪"; $list["住所4"]="大阪"; $list["住所5"]="北海道"; と合った場合に、重複排除にarray_uniqueを使うと思いますが、 重複排除ではなく、重複しているKeyを列挙したい場合はどうすればシンプルでしょうか? 今回の例で言えば、値 東京で重複しているのが住所1、住所2で 大阪で重複しているのが 住所3,住所4であるということを表示したいと思っています。 得た値のフォーマットとしては例えば $dup["東京"] = array("住所1","住所2"); $dup["大阪"] = array("住所3","住所4"); のようにできたら便利です。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#244856
noname#244856
回答No.1

array_flipという関数がありますが,これは重複要素を削除してしまうので手動でループするしか無さそうです…残念… $dup = []; foreach ($list as $key => $value) {     $dup[$value][] = $key; } $dup = array_filter($dup, function ($items) {     return count($items) > 1; });

sarusearch
質問者

お礼

サンプルまで提示していただきありがとうございました。 参考にさせていただきます。

関連するQ&A

  • 空の配列を削除して、詰めていく。

    データベースから値を取ってくるとき、全て、同じ値が入ってくる場合があります。 $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
  • 配列で特定キーが同じ値だった場合のみ、特定キー連結

    ■修正前 ・下記のような配列があるとき [0] => Array   (     [id] => 1     [pre] => '東京'     [pre_id] => 7     [rank] => A   ) [1] => Array   (     [id] => 1     [pre] => '大阪'     [pre_id] => 2     [rank] => A   ) [2] => Array   (     [id] => 4     [pre] => '名古屋'     [pre_id] => 3     [rank] => B   ) ■修正後 ・同じidがあったときだけ(3つ以上の可能性もあり)、[pre] [pre_id]をまとめたい(それ以外のキーと値は同じ) [0] => Array   (     [id] => 1     [pre] => '東京','大阪'     [pre_id] => 7,2     [rank] => A   ) [1] => Array   (     [id] => 4     [pre] => '名古屋'     [pre_id] => 3     [rank] => B   )

    • ベストアンサー
    • PHP
  • 2つの配列から新しい配列を作成したい

    「Array A B」より「Array C」を作成したいのですが、どうしたらいいでしょうか? ※「Array A」キーと「Array B」idキーの値を結び付けたい Array A (   [3] => 3   [1] => 15   [4] => 3   [2] => 6 ) Array B (   [0] => Array     (       [id] => 1       [area] => 東京     )   [1] => Array     (       [id] => 2       [area] => 大阪     ) )   ↓ Array C (   [0] => Array     (       [1] => 15       [area] => 東京     )   [1] => Array     (       [2] => 6       [area] => 大阪     ) )

    • ベストアンサー
    • PHP
  • 列挙の仕方

    Vaio, MS OFFICE XP, Win XP 二つのリストを一枚のEXCEL上で列挙する方法教えてください。 どちらのリストにも国名と都市名がありますが都市名についてはどちらのリストも数が違います。その二つのリストを対にしたいと思うのですがどうしたら出来るでしょうか? 日本 東京  日本 東京     大阪            京都     横浜     横浜     札幌           神戸 のように同じ都市名があれば並ぶように、なければそこを空けるように。 これは数値の比較リストを作成するのが目的です。 よろしく

  • 【VBA】セルに含まれない値を追加していく

    VBA初心者です あるリストの、指定の列の重複しない値のリストを作成したいのですが 具体的には A B C 1 大阪 りんご 10 2 東京 りんご 20 3 東京 りんご 30 4 名古屋 ごりら 40 5 福岡 ごりら 50 6 大阪 らっぱ 60 指定のセル内(E1:E10)にA列の重複しないリスト (この例だと、大阪、東京、名古屋、福岡) を作成したいのです いくつか試してみたけれどうまくいきません どのようなVBAを作成すればよいでしょうか よろしくお願いいたします

  • 配列中のあるキー、値を取得して、それを変更したい

    やりたいことは、 $hoge = array ( 0 => '1', 1 => '2', 2 => '3', 3 => '3', 4 => '3' ); のような配列があったとします。 この配列の値の出現頻度を調べて、 $hoge_syutugen_hindo = array_count_values($hoge); print_r($hoge_syutugen_hindo); $hoge_syutugen_hindoの結果 Array ( [1] => 1 [2] => 1 [3] => 3 ) $hoge_syutugen_hindoの結果で[3]の出現頻度が3回以上あったら、 Array ( [1] => 1 [2] => 1 [3] => 3 ) を Array ( [1] => 1 [2] => 1 [4] => 1 ) に変更。 少ない場合は Array ( [1] => 1 [2] => 1 [3] => 2 ) を Array ( [1] => 1 [2] => 1 [3] => 2 ) そのままの配列を返したいのです。 $hogeの配列の値には必ずしも1や2が含まれるわけではありません。 $hoge = array ( 0 => '3', 1 => '3', 2 => '3' ); や$hoge = array ( 0 => '1', 1 => '3', 2 => '3', 3 => '3' ); のようなパターン等もあります。 わたしなりに下記のようなスクリプトを作成しましたが、 $arr_pattern = '/^(3\s=>\s)[3-99]$|^(3=>)[3-99]$|^(3=>\s)[3-99]$|^(3\s=>)[3-99]$|^(3\s=>\s)\'[3-99]\'$|^(3=>)\'[3-99]\'$|^(3=>\s)\'[3-99]\'$|^(3\s=>)\'[3-99]\'$|^(\[3\]\s=>\s)[3-99]$|^(\[3\]=>)[3-99]$|^(\[3\]=>\s)[3-99]$|^(\[3\]\s=>)[3-99]$|^(\[3\]\s=>\s)\'[3-99]\'$|^(\[3\]=>)\'[3-99]\'$|^(\[3\]=>\s)\'[3-99]\'$|^(\[3\]\s=>)\'[3-99]\'$/'; reset($deliyery_kind_syutu); while(list($k, $v) = each($deliyery_kind_syutu)) { $kv = "$k=>$v"; if(preg_match($arr_pattern, $kv)){ $new_hkv = preg_replace($arr_pattern,'4 => 1', $kv); $n = count($deliyery_kind_syutu); for($i=0; $i<$n; $i++){ $new_array[] = ($deliyery_kind_syutu[$i]); } $new_array[] = $new_hkv; } } array ( 0 => NULL, 1 => 1, 2 => 1, 3 => '4 => 1', )となり、array(1 => 1, 2 => 1, 4 => 1)のような結果になりませんでした。 分かる方が見えましたらご教授ください。

    • ベストアンサー
    • PHP
  • excel2003の、値抽出方法について。

    写真のように、A列に重複しているリストがあります。 C列に重複を排除したリストを作成する場合。 どのようにすればいいでしょうか。 VBAで記述した場合の方法と、関数の場合の方法とで それぞれ教えていただけるとありがたいです。

  • 多次元配列の重複削除

    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
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • PHPを使ったPOSTについて教えてください。

    <body> <form action="" method="post"> <select id="list" name="list" > <option value="">選択してください</option> <option value="ichigo">いちご</option> <option value="orange">オレンジ</option> </select> <input type="text" size="30" id="word" name="word" > <input type="submit" value="検索"> </form> <?php $array = array(); $array['green'] = 'グリーン'; $array['red'] = 'レッド'; if (isset($_REQUEST['word'])) { $array ['key']=$_REQUEST['word']; } if (isset($_REQUEST['list'])) { $array ['List']=$_REQUEST['list']; } print_r($array); ?> </body> これを表示した場合、はじめのページでは Array ( [green] => グリーン [red] => レッド ) と表示されますが、フォームを実行すると、このように表示されます。 Array ( [green] => グリーン [red] => レッド [key] => [List] => ) これを、もしkeyやListの値が何も入力されなかった場合、listで言えば「選択してください」が選択されで実行された場合、[key] =>や [List] =>を表示しないと言うことはできますか? 例えばlistをデフォルトの「選択してください」のまま選択せず、テキスト欄に「テキスト」と入力したら、 Array ( [green] => グリーン [red] => レッド [key] => テキスト) とこのように[List] =>は省きたいです。 そのためにissetを使ったつもりでしたが、うまくいきませんでした。 どうしたら良いでしょうか?教えてください、よろしくお願いします。

    • 締切済み
    • PHP