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

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

ただいまの
回答率

90.53%

  • PHP

    23495questions

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

  • MySQL

    6805questions

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

  • PDO

    370questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,755

SugiuraY

score 197

お世話になります。

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な解決法をアドバイスご教示願えますでしょうか。
宜しくお願い申し上げます。

$array_ko=
Array
(
    [0] => Array
        (
            [0] => A
            [1] => 100
            [2] => 200
            [3] => 300
        )
//以下省略
)

$array_Otsu=
Array
(
    [0] => Array
        (
            [0] => A
            [1] => "a"
            [2] => "b"
            [3] => "c"
        )
  [1] => Array
        (
            [0] => B
            [1] => "d"
            [2] => "e"
            [3] => "f"
        )
)

//もし$array_Ots該当がなければ、こちらの配列から検索する
$array_Hei=
Array
(
    [0] => Array
        (
            [0] => C
            [1] => "foo"
            [2] => "hoge"
                   )
//以下省略
)

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

for ($i=0; $i <count($array_Otsu) ; $i++) {
for ($i1=0; $i1 <count($array_Hei) ; $i1++) 
  if ($array_ko[0][0]==$array_Otsu[$i][0]) {
    $get=$array_Otsu[$i][1];
  }else//省略
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

SELECT
CASE WHEN OTSU.a IS NULL THEN HEI.a ELSE OTSU.a END as a
FROM
KO
LEFT JOIN OTSU ON KO.A = OTSU.A
LEFT JOIN HEI ON KO.A = HEI.A

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/10 15:23

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

    キャンセル

  • 2017/02/10 15:27

    どちらからもJOINしてしまいますが、SELECT句内で、OTSU.aがNULLの場合HEI.a、としているので、JOINした上でフェッチされるものはOTSUの方だけになる、という寸法です。

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

    キャンセル

  • 2017/02/10 17:33

    横から失礼します。

    COALESCE 関数を使えば、もう少し簡潔に書けますよ。
    https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html#function_coalesce

    http://sqlfiddle.com/#!9/c401f4/1
    http://sqlfiddle.com/#!9/c401f4/3

    キャンセル

  • 2017/02/10 17:59

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

    キャンセル

  • 2017/02/10 18:33

    ?

    キャンセル

  • 2017/02/13 10: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が混在するって意味です

    キャンセル

  • 2017/02/13 11:14

    レスありがとうございます。

    それは SWITCH 構文で書いても同じことですね。

    キャンセル

  • 2017/02/13 11: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

    キャンセル

0

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

$array_ko=
Array
(
   Array
        (
            "id" => "A",
            "val1" => 100,
            "val2" => 200,
            "val3" => 300
        )
//以下省略
);

$array_Otsu=
Array
(
    Array
        (
            "id" => "A",
            "val1" => "a",
            "val2" => "b",
            "val3" => "C"
        ),
  Array
        (
            "id" => "B",
            "val1" => "d",
            "val2" => "e",
            "val3" => "f"
        )
);

//もし$array_Ots該当がなければ、こちらの配列から検索する
$array_Hei=
Array
(
    Array
        (
            "id" => "C",
            "val1" => "g",
            "val2" => "h",
            "val3" => "i",
                   )
//以下省略
);

foreach ($array_ko as $key => $value_ko) {
    $result = keySearch($value_ko["id"], $array_Otsu);
    if (!$result){
        $result = keySearch($value_ko["id"], $array_Hei);
    }
}
//ここで配列を検索する
function keySearch($searchKey , $searchArray){
    foreach ($searchArray as  $value) {
        if($searchKey === $value["id"]){
            $returnArray["id"] =  $value["id"];
            $returnArray["val1"] =  $value["val1"];
            $returnArray["val2"] =  $value["val2"];
            $returnArray["val3"] =  $value["val3"];
            return $returnArray;   
        }
    }
    return FALSE;
}

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

function  key_search2($searchKey,$searchArray){
    $id = array_search($searchKey, array_column($searchArray, 'id'));
    if($id !== false){
        return $searchArray[$id];    
    }else{
        return FALSE;
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/10 15:26

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

    キャンセル

  • 2017/02/10 15:45

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

    キャンセル

  • 2017/02/10 17:10

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    23495questions

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

  • MySQL

    6805questions

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

  • PDO

    370questions

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

  • トップ
  • PHPに関する質問
  • PHPで配列同士を比較して、一致する要素があれば相手の配列の他の要素を取得する方法