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

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

ただいまの
回答率

89.96%

PHPの配列で「子」の値から親のキーを見つけたい

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,190

ozaki566

score 25

お世話になります。初歩的な質問で申し訳御座いません。
入力したキーワードを元に、配列にした都道府県の番号を取得するプログラムを書いているのですがつまずいています。

例えばユーザーが「北海道」と入力したとき、事前に配列に入れた北海道の都道府県番号「1」を取得するために下記のように書き問題なく動作しています。

$keyword = "北海道";//例
$pref = array(1=>'北海道',2=>'青森',3=>'岩手',4=>'宮城'・・・・
$prefno = array_search($keyword, $pref);

しかし検索の揺れを考慮して「北海道」以外に「札幌」「苫小牧」「函館」等のキーワードでも$prefnoで「1」を表示させたいのですが、子の配列を作り,foreach等を使ってすべて展開するしか方法はないでしょうか?

【希望する動作】
'北海道','札幌','苫小牧'いずれのキーワードでも$prefに「1」を返したい

$pref = array(1=>('北海道','札幌','苫小牧'),2=>'青森',3=>'岩手',4=>'宮城・・・

今後キーワードなどを一層増やしていくとメモリ等に余計な不可を掛けるのではと思い、実装前に質問をさせて頂きました。

また現在完全一致のみヒットするようにしており、「福」と入力しても「福島」「福井」「福岡」は当然ヒットしないのですが、配列を

$pref = array(a=>'福井県',b=>'福島県',c=>'福岡県')


とした場合「福」ではどれにもヒットさせず「福井」では「$pref = a」を返すような正規表現は可能でしょうか?

宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+2

もしそのような要望をお客さんから出されたら、私ならデータは配列で持たずにDBに格納しますし、検索はSQLに任せる。そういう設計をします。

配列でデータを持つというアプローチはしません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

どうしてもPHPでやらなくてはいけなくて、データの量に走査速度を影響させたくないなら
私ならキーと値を逆転させて保持させます。

$keyword = "北海道";//例
$pref = array('北海道' => 1,'札幌' => 1,'苫小牧' => 1 ,'青森' => 2 ...);
$prefno = isset($pref[$keyword]) ? $pref[$keyword] : false;
$pref[$keyword]


というように、添字でのアクセスであれば、配列の要素数に走査時間が影響されないためです。
ただし、このやりかたですと北海道、札幌、苫小牧の間の上下関係は表現できなくなります。
また、正規表現での走査もこの方法ですと出来なくなります。

参考:配列の要素確認と実行速度 アシアルブログ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

どうしてもやりたければこういう感じ。でも多分キーワード転置のほうが正解だと思う。

$pref = array(1=>['北海道','札幌','苫小牧'],2=>'青森',3=>'岩手');
$search = "苫小牧";
$fil = array_filter($pref, function($k) use($search){
    if(is_array($k)) { return array_search($search, $k) !== false;}
    else {return $k == $search;}
});
var_dump($fil);

福井県と福井については"/^".$prefname."[都道府県]/"とかですかね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

メンテナンス性は非常に悪いですが、ちょっと思いついたのでw

<?php
$test_arr = ['北海道', '青森', '福島'];
$prefecture = '北海道札幌苫小牧青森岩手宮城福井福島福岡';

foreach ($test_arr as $val) {
    $result = mb_strpos($prefecture, $val);
//    echo $result.PHP_EOL;
    echo select_pref($result);
}

function select_pref($result){
    if(0 <= $result && $result < 8)return '北海道';
    if(8 <= $result && $result < 10)return '青森';
    if(17 <= $result && $result < 19)return '福島';
}


ajax 等で入力補助するイメージなんですかねぇ。
入力文字2文字以上に反応させれば良いと思います。
都道府県の範囲では、2文字でユニークになります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる