質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5148閲覧

PHPで配列同士を比較して、一致する要素があれば相手の配列の他の要素を取得する方法

SugiuraY

総合スコア317

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/02/10 05:37

編集2017/02/10 05:54

お世話になります。

PHPで配列の要素同士を比較して、一致するものがあれば、比較対象の他の要素を取得するスマートな方法を検討しています。
下記のコードの例の場合
$array_ko
のなかの$array_ko[0][0]にあるAが
$array_Otsu
のなかの$array_Otsu[0][0]のAと一致する場合
$array_Otsu[0][1]の"a"を取得することが目的です。

イメージとしてはエクセルのvlookupに近いです。
Aをkeyにして、他のデータの"a"を取得したいということになります。

ここで$array_OtsuはMYSQLからfetchallしてきたデータなので、
もともとはMYSQL上でJOINさせることで解決しようと考えたのですが
今回は2段階で、もし$array_Otsu該当がなければ、
$array_Heiから同様に検索をしていこうとしているため、php上での
処理を検討しております。

どなたかsmartな解決法をアドバイスご教示願えますでしょうか。
宜しくお願い申し上げます。

PHP

1$array_ko= 2Array 3( 4 [0] => Array 5 ( 6 [0] => A 7 [1] => 100 8 [2] => 200 9 [3] => 300 10 ) 11//以下省略 12) 13 14$array_Otsu= 15Array 16( 17 [0] => Array 18 ( 19 [0] => A 20 [1] => "a" 21 [2] => "b" 22 [3] => "c" 23 ) 24 [1] => Array 25 ( 26 [0] => B 27 [1] => "d" 28 [2] => "e" 29 [3] => "f" 30 ) 31) 32 33//もし$array_Ots該当がなければ、こちらの配列から検索する 34$array_Hei= 35Array 36( 37 [0] => Array 38 ( 39 [0] => C 40 [1] => "foo" 41 [2] => "hoge" 42 ) 43//以下省略 44) 45

こんな古典的にやりかたしか思いつかないのですが、
配列の要素の量が重いのでphpの処理がすごく重い気がします。。。

PHP

1for ($i=0; $i <count($array_Otsu) ; $i++) { 2for ($i1=0; $i1 <count($array_Hei) ; $i1++) 3 if ($array_ko[0][0]==$array_Otsu[$i][0]) { 4 $get=$array_Otsu[$i][1]; 5 }else//省略 6}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問の直接的な回答でなくてすみません

CASE式をつかってMySQLで処理することは可能だと思いますよ
HEIからの検索が必ず行われる…であるとか、フィールド数が多いとSQLが読みにくいとかの難はありますが

SQL

1SELECT 2CASE WHEN OTSU.a IS NULL THEN HEI.a ELSE OTSU.a END as a 3FROM 4KO 5LEFT JOIN OTSU ON KO.A = OTSU.A 6LEFT JOIN HEI ON KO.A = HEI.A

投稿2017/02/10 06:16

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2017/02/10 06:23

ご回答有難うございます。MYSQLでもケース処理が可能なんですね、、 しかし一点結果が分からないことがあるのですが、場合によっては $array_Otsuにも$array_Heiにもどちにも該当がある場合、どちらからもJOINしてしまうのでしょうか?
haru666

2017/02/10 06:27

どちらからもJOINしてしまいますが、SELECT句内で、OTSU.aがNULLの場合HEI.a、としているので、JOINした上でフェッチされるものはOTSUの方だけになる、という寸法です。 なので、複数フィールドがあると記述が面倒だなあ、という感じです。 複数フィールドがある場合でも、WHEN句内を「OTSU.a IS (NOT) NULL」に統一しておけば、OTSU内にNULLカラムがあってそこだけHEIになってしまう問題などは避けれます。
haru666

2017/02/10 08:59

情報ありがとうございます。 確かに、1フィールドならこっちの方が良いですね! 数フィールドあってNULLカラムが含まれてると困りますが…
haru666

2017/02/13 01:14

OTSU id NOT NULL, value1 NOT NULL, value2 NULL HEI id NOT NULL, value1 NOT NULL, value2 NOT NULL この状態で COALESCE(OTSU.value1, HEI.value1), COALESCE(OTSU.value2, HEI.value2), とするとOTSUのvalue1とHEIのvalue2が混在するって意味です
KiyoshiMotoki

2017/02/13 02:14

レスありがとうございます。 それは SWITCH 構文で書いても同じことですね。
haru666

2017/02/13 02:31

いえ、以下のようにすれば大丈夫です CASE WHEN OTSU.id IS NULL THEN HEI.value1 ELSE OTSU.value1 END, CASE WHEN OTSU.id IS NULL THEN HEI.value2 ELSE OTSU.value2 END
guest

0

こんな書き方は如何でしょうか?複数の配列が同じ構造である前提で作っていますが…

PHP

1$array_ko= 2Array 3( 4 Array 5 ( 6 "id" => "A", 7 "val1" => 100, 8 "val2" => 200, 9 "val3" => 300 10 ) 11//以下省略 12); 13 14$array_Otsu= 15Array 16( 17 Array 18 ( 19 "id" => "A", 20 "val1" => "a", 21 "val2" => "b", 22 "val3" => "C" 23 ), 24 Array 25 ( 26 "id" => "B", 27 "val1" => "d", 28 "val2" => "e", 29 "val3" => "f" 30 ) 31); 32 33//もし$array_Ots該当がなければ、こちらの配列から検索する 34$array_Hei= 35Array 36( 37 Array 38 ( 39 "id" => "C", 40 "val1" => "g", 41 "val2" => "h", 42 "val3" => "i", 43 ) 44//以下省略 45); 46 47foreach ($array_ko as $key => $value_ko) { 48 $result = keySearch($value_ko["id"], $array_Otsu); 49 if (!$result){ 50 $result = keySearch($value_ko["id"], $array_Hei); 51 } 52} 53//ここで配列を検索する 54function keySearch($searchKey , $searchArray){ 55 foreach ($searchArray as $value) { 56 if($searchKey === $value["id"]){ 57 $returnArray["id"] = $value["id"]; 58 $returnArray["val1"] = $value["val1"]; 59 $returnArray["val2"] = $value["val2"]; 60 $returnArray["val3"] = $value["val3"]; 61 return $returnArray; 62 } 63 } 64 return FALSE; 65}

後は検索のfunctionでこの様な書き方もできますね。
でも、行数は短くなりますが、Array_searchは遅いので、上記の方法でループした方が処理は早いかもしれません。

php

1function key_search2($searchKey,$searchArray){ 2 $id = array_search($searchKey, array_column($searchArray, 'id')); 3 if($id !== false){ 4 return $searchArray[$id]; 5 }else{ 6 return FALSE; 7 } 8}

投稿2017/02/10 06:10

編集2017/02/10 06:28
motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2017/02/10 06:26

ご回答ありがとうございます。大変参考になりました。 実際に処理を動かしてみたのですが、completeせずに、処理が止まってしまったのですが、やはり処理多すぎてPHPでは処理できないのでしょうか?またはこれを解消する方法はありますでしょうか?
motuo

2017/02/10 06:45

とすると、配列だけで処理をするのは厳しいのかもしれません。 haru666様の様にJOINしてとってしまうか、それが難しければarray_Otsuを持っているテーブルを改めてPHPからselectした方が良いのかもしれませんね。(適切にindex貼られていれば、SQLの方が早いかもです。。。)
SugiuraY

2017/02/10 08:10

了解いたしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問