• ベストアンサー

配列を比較して同じものがあった場合にそのKEYを返す

二つの配列を比較して同じ値が入っていた場合、そのKEYを配列に入れたいと思います。 (例)$aと$bを比較して同じ値が入っているときに$aのkeyを$cに格納したい。 $a = array("","","山","","川","海","","富士山","空","",""); $b = array("川","","","","","海","","富士山","空",""); ※空白は無視したい。 この場合 $c = array("4","5","7","8"); のようにしたいと思います。 どなたか教えてください。

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

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

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

全件比較なら、foreachを二重で回せばよいのでは? <? $a = array("","","山","","川","海","","富士山","空","",""); $b = array("川","","","","","海","","富士山","空",""); foreach($a as $key=>$val){ foreach($b as $val2){ if($val!="" and $val===$val2) $c[]=$key; } } print_r($c); ?> ただ、空白の頻度がたかいのであれば、先に除外した方が 効率はよいでしょう。 <? $a = array("","","山","","川","海","","富士山","空","",""); $b = array("川","","","","","海","","富士山","空",""); foreach($a as $key=>$val){ if($val!=="") $aa[$key]=$val; } foreach($b as $key=>$val){ if($val!=="") $bb[$key]=$val; } foreach($aa as $key=>$val){ foreach($bb as $val2){ if($val===$val2) $cc[]=$key; } } print_r($cc); ?>

hunter_999
質問者

お礼

ありがとうございます。 希望通りのことができました。

その他の回答 (1)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

すでに回答が出ているようですので、不要な情報とは思いますが 処理速度を優先するなら、ループを回さずに求める方法もあります <?php $a = array("","","山","","川","海","","富士山","空","",""); $b = array("川","","","","","海","","富士山","空",""); $a1=array_flip($a); $b1=array_flip($b); $c1=array_intersect_key($a1,$b1); unset($c1[""]); $c=array_values($c1); print_r($c); ?>

関連するQ&A

  • JavaScriptの連想配列について

    myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C001"] = "C001";    myArray["A001"]["B002"]["C002"] = "C002";  myArray["A002"] = "A002"; JavaScriptの連想配列について質問させて頂きます。 例えば上記のような配列があったとして、値とキーはそのままで "C001" と "C002" の"B002"配列への格納順序だけ入れ替えたい場合、 どのように実装すればよろしいでしょうか? ちなみにキーや値はサンプルで実際にはsort出来るルールはありません。。。 ※入れ替え後のイメージ --------------------------------------------------------------------- myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C002"] = "C002"; ←格納順序が    myArray["A001"]["B002"]["C001"] = "C001";  入れ替わった  myArray["A002"] = "A002"; ---------------------------------------------------------------------

  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 二つの配列のマッチング

    お世話になっております。 配列$a と $b から配列$cを作りたい。 どうすればいいですか? $a = array('200708', '200709', '200710' ,'200711', '200712', '2000801); $b = array('200710,3', '200712,1'); $c = array('200708,0', '200709,0', '200710,3' ,'200711,0', '200712,1', '2000801,0); または、 $c = array('200708', '200709', '200710,3' ,'200711', '200712,1', '2000801);

    • 締切済み
    • PHP
  • 参照変数の親配列を取得

    データの多次元配列があって、値に応じて動的に関数を選択し 中身の値を引数で渡すみたいな感じの処理をしています ほとんどの処理は中身の値だけあれば事足りるのですが 稀にキー値を使いたい処理がでてきます 本当に稀なので引数にキー値も渡すようにするのは 無駄が多くなるように思うので避けたく できれば参照変数で渡される値から 親配列でのキー値を取得したいと思っています $arr2A=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2B=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2C=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); foreach($arr2A as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2B as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2C as $key=>$val){ $fncs[$val['fnc']]($val); } $fncs=array( A=>function(&$arr){ }, B=>function(&$arr){ }, C=>function(&$arr){ //ここで稀にキー値も使いたい }); 実際のコードはかなり長いので載せられませんが 要約すると上記のような感じの処理です まずどのデータ配列の集合から渡されたのかが明確ではありませんので indexOfなどでキー値を得るのというのが難しいです 現在は、その処理が必要なデータ行について処理前に 中身にキー値をあらかじめ入れてしまう というように対応しているので、一応解決はしているのですが もし参照変数から親配列を得る方法が あればと思い質問させていただきました ”そんなものはない”という回答も あきらめつくのでお願いします

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

    データベースから値を取ってくるとき、全て、同じ値が入ってくる場合があります。 $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で教えて欲しいです。 例えば、 $aaa = Array ( [0] => Array ( [id] => 1 [date] => 2009-07-14 [b1] => [b2] => [b3] => [b4] => [b5] => ) [1] => Array ( [id] => 1 [date] => 2009-07-15 [b1] => [b2] => [b3] => [b4] => [b5] => ) と言うような配列があります(実際にはキーは0から13まで固定) そこにもうひとつの配列 $bbb = Array ( [0] => Array ( [id] => 1 [date] => 2009-07-15 [b1] => true [b2] => false [b3] => true [b4] => false [b5] => true ) があります(キーは最大13個ですが、毎回不定数) このような場合で、$aaa配列の[date]と$bbb配列の[date]が同じ物が有った場合、$aaa配列の該当する部分の値を、$bbb配列の値で置き換えたいのですが、どのような方法があるでしょうか? お願いいたします。

    • 締切済み
    • PHP
  • Action Script 2.0 配列の比較

    複数のチェックボックスの値(true,false)を取得して配列に格納し、別の配列(A、B、C)と比較をし一致項目の多い配列を決める処理を実現したくて四苦八苦しておりました。 更に細かく書かせて頂くと 1.チェックボックスは12個 2.複数選択可 3.チェックが5個以下の場合は、ボタンを押しても動かないようにする 4.12個全ての値を取得しtrueの値のみの番号を別の配列に入れる チェックボックスの値の取得し、配列に入れるところまでは大丈夫なんですが、その後の「比較して一致項目の多いものを選択」という作業で詰まってました。 例として・・・・ アンサー配列[1,2,3,4,6,8]があった場合 一致項目が多いもの A配列[1,4,5,6,7,8] この場合4個同じ B配列[1,2,3,4,5,6,7,8] この場合6個同じ C配列[1,2,8,9,10,11] この場合3個同じ 結果として ○完全一致の場合の処理 ○一致項目が多い場合の処理 ○3つとも同じ場合の処理 この場合は、B配列に決定という流れを考えてました。 どなたかお知恵を授けて頂ければと思います。

    • ベストアンサー
    • Flash
  • 配列の比較について

    Javascritpで配列全体の比較を行いたいのですが 下の結果が「違います」のように表示させたいのです。 比較の部分はどのように書いたらよいのでしょうか? var a1 = new Array(); var a2 = new Array(); a1['a'] = 1; a1['c'] = 2; a2['a'] = 1; a2['c'] = 3; //=========== 以下の配列の比較方法 if (a1 == a2){ alert('同じです'); } else { alert('違います'); }

  • 2つの配列/キーが一致する際、要素数の出現回数を求

    2つの配列があり、かつキーが一致する際、要素数の出現回数を求めたいのですが、 どうすれば良いでしょうか? 具体的には、下記「a、b」より「c、d」を導き出したいです ■元データ( a、b キーは対応) Array a (   [0] => 1   [1] => 2   [2] => 2   [3] => 1   [4] => 3   [5] => 1   [6] => 2   [7] => 2   [8] => 3   [9] => 1 ) Array b (   [0] => 0   [1] => 1   [2] => 0   [3] => 1   [4] => 1   [5] => 1   [6] => 1   [7] => 0   [8] => 2   [9] => 1 ) ■欲しい結果 Array c … 「Array b」が1の時の、「Array a」の値の出現回数(キーは「Array a」の値) (   [1] => 3   [2] => 2   [3] => 1 ) Array d … 「Array b」が1以外(0または2)の時の、「Array a」の値の出現回数(キーは「Array a」の値) (   [2] => 2   [1] => 1   [3] => 1 ) ■備考 「Array b」が1の時の「Array a」   [1] => 2   [3] => 1   [4] => 3   [5] => 1   [6] => 2   [9] => 1 ・1が3回 ・2が2回 ・3が1回 「Array b」が1以外の時の「Array a」   [0] => 1   [2] => 2   [7] => 2   [8] => 3 ・2が2回 ・1が1回 ・3が1回

    • ベストアンサー
    • PHP
  • 特定の要素を抜き取って連想配列へ

    例えば、 $hoge = "%_A_%あ%_A_%%_B_%123%_B_%%_C_%%_C_%%_D_%hogehoge%_D_%"; というようなデータがあった場合、 %_?_% の?部分を連想配列のキーとして、 そのはさまれた部分を前途キーの内容として格納したいのですが、 どのようにすればいいでしょうか? (%_?_%~%_?_% において?の組み合わせは必ず単一でしか存在しません) 求めている結果は $array['A'] => あ $array['B'] => 123 $array['C'] => //空要素 $array['D'] => hogehoge のような形です とりあえず if (preg_match("/%_([A-Z])_%(.*)%_$1_%/" , $hoge ,$matched) ){ // $matchedを解析して$arrayに割り当て } とすればいけるかな、と思いやってみましたがパターンマッチの条件にすら当てはまらず撃沈 preg_matchのマッチ条件内ではまだ$1が使えないようでした 環境はPHP4です よろしくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう