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

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

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

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

Q&A

解決済

4回答

1303閲覧

PHP データの検索

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

2グッド

0クリップ

投稿2016/04/10 14:44

下記のような情報をPHPで参照するにはどのような手法がよいでしょうか。
一般的な方法がわからず困っています。

アラビア語・・・ar,ar-sa,ar-ae,ar-bh,ar-dz,ar-eg,ar-iq,ar-jo,ar-kw,ar-lb,ar-ly,ar-ma,ar-om,ar-qa,ar-sy,ar-tn,ar-ye

アフリカーンス語・・・af,af-za
アルバニア語・・・sq,sq-al
(以下略)

<やりたいこと>
例:
arという文字列渡すと、アラビア語と返す。
sq-alと渡すとアルバニア語と返す。
・・・

<思いつく方法と考え>

  1. DBに格納する

速度も落ちるしデータ自体が不変のためよくない気がする・・・

  1. 配列データに変換(シリアライズ化して外部化)

例:'ar'=>'アラビア語','ar-sa'=>'アラビア語'・・・
これが一番よさそうな気がする・・・

  1. 正規表現を使う

例:if(preg_match(/ar|ar-sa|ar-ae/・・・){
return 'アラビア語';
}
重そうだしコードが・・・

  1. if、スイッチ

if(== 'ar') return 'アラビア語';
if(== 'ar-sa') return 'アラビア語';

処理的には一番早そうだけどコード的に微妙・・・

よろしくお願いいたします。

mpyw, miyabi-sun👍を押しています

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

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

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

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

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

guest

回答4

0

実行速度は気にせず、可読性と保守性(※)の観点から、ご自身がもっとも優れていると思う方法を採用すればよいかと思います。
※データの追加・修正があった際の変更のしやすさ

なぜなら、よほどシビアな性能を求められているのではない限り、アプリケーション全体の実行コストに対するこのコードの実行コストの割合は微々たるもののはずだからです。

ちなみに私なら、-以降は無視して

php

1$languages = array( 2 'ar' => 'アラビア語', 3 'af' => 'アフリカーンス語', 4 'sq' => 'アルバニア語', 5 ... 6); 7 8function get_language_name($arg) { 9 $code = explode('-', $arg, 2); 10 11 return $languages[$code[0]]; 12}

とやりますw

もしくは、言語コード-国コードの一覧に他の用途が想定されるなら、以下のようなテーブル構造のDBに格納してしまうかと思います。

sql

1CREATE TABLE languages ( 2 code char(2) PRIMARY KEY, 3 name varchar(128) NOT NULL 4); 5 6INSERT INTO languages VALUES 7 ('ar', 'アラビア語'), 8 ('af', 'アフリカーンス語'), 9 ('sq', 'アルバニア語'), 10 ...; 11 12 13CREATE TABLE countries ( 14 code char(2) PRIMARY KEY, 15 name varchar(128) NOT NULL 16); 17 18INSERT INTO countries VALUES 19 ('sa', 'サウジアラビア王国'), 20 ('za', '南アフリカ共和国'), 21 ('al', 'アルバニア共和国'), 22 ...; 23 24 25CREATE TABLE language_country ( 26 language_code char(2), 27 country_code char(2), 28 PRIMARY KEY (language_code, country_code), 29 FOREIGN KEY (language_code) REFERENCES languages(code), 30 FOREIGN KEY (country_code) REFERENCES countries(code) 31); 32 33INSERT INTO language_country VALUES 34 ('ar', 'sa'), 35 ('af', 'za'), 36 ('sq', 'al'), 37 ...

これなら、DBの一意制約やリレーションを利用できるためにデータの管理が容易になるのと、
例えば
「国コードから、その国で使われている言語を取得する」
など、他の用途にも利用しやすくなるからです。

投稿2016/04/11 18:13

KiyoshiMotoki

総合スコア4791

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

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

0

わたしなら用途によって「1.DBに格納する」か「2.配列データに変換」を使います。

ただ、

php

1array( 2 'ar' => 'アラビア語', 3 'ar-sa' => 'アラビア語', 4 : 5);

とかよりも、

php

1array( 2 'ar' => 'ar', 3 'ar-sa' => 'ar', 4 : 5);

php

1array( 2 'ar' => 'アラビア語', 3 : 4);

のように2つに分けるほうがよいかもしれません(そもそも1つめのは必要??)。

「1.DBに格納する」については、もしその値をRDBに格納することがあるのであれば(人物テーブルの言語フィールド、みたいに)、言語テーブルも同じくRDBに格納し外部キー制約を貼る必要があるかもしれないからです。

投稿2016/04/11 02:10

ngyuki

総合スコア4514

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

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

0

ベストアンサー

2と4で悩みどころですね.2はハッシュが衝突しない限り処理時間が一律になりますが,配列を用意する時間がかかってしまいます.4は先頭のほうは非常に高速ですが,後ろのほうになると遅くなってしまいます.(といっても配列作ってる2より速い?)なお,4はswitch文のフォールスルーを使ってもう少し見やすく書けます.

総合的に判断すると4かな?

php

1function language_name($language_code) 2{ 3 switch($language_code) { 4 case 'ar': 5 case 'ar-sa': case 'ar-ae': case 'ar-bh': case 'ar-dz': 6 case 'ar-eg': case 'ar-iq': case 'ar-jo': case 'ar-kw': 7 case 'ar-lb': case 'ar-ly': case 'ar-ma': case 'ar-om': 8 case 'ar-qa': case 'ar-sy': case 'ar-tn': case 'ar-ye': 9 return 'アラビア語'; 10 11 case 'af': 12 case 'af-za': 13 return 'アフリカーンス語'; 14 15 case 'sq': 16 case 'sq-al': 17 return 'アルバニア語'; 18 19 default: 20 throw new \UnexpectedValueException; 21 } 22} 23

投稿2016/04/10 22:46

編集2016/04/10 22:48
mpyw

総合スコア5223

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

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

mpyw

2016/04/11 23:54 編集

実行速度について言及しましたが、この関数を1リクエスト中に何回も実行しない場合は微々たるコストにしかならないので、あまり気にしなくていいです。 他の用途に活用する可能性がある場合はngyukiさんの回答、この用途だけで完結し変更も少ない場合は私の回答を推奨しておきます。
mpyw

2016/04/12 00:20

なお,X-YのYの部分を無視してもいい場合はswitch文を使うよりも連想配列の定義のほうがよいでしょう.複数対ひとつの関係を連想配列は定義できないためこちらを使っているだけです.
guest

0

再利用や綺麗さを考えるとどれもイマイチですね。
1はDBというシステムと密結合、マイグレーションファイルで管理すればいいので△
2はPHP言語と密結合、いろんな可能性を考えた時の最適解に近そうなので○
3と4は保守し難いので論外…ただしコンパイル後としてはアリか?

あるべき姿で考えてDBサーバーに突っ込むのが嫌なら、JSONやSQLiteを利用する案もあります。

JSON

1{ 2 ar: "アラビア語", 3 af: "アフリカーンス語", 4 ... 5}

しかしJSONファイルをPHPで都度読み込んでデコードし始めると速度はあってないようなもの。
速度を求めるなら自力でクイックソートのコードを書いたりする必要がありそうです。

速度と綺麗さを求めるのであれば、コンパイル用のNode.jsバッチを作成して…
JSONファイルから下記のようなPHPコードに変換してみてはいかがでしょう?
作ってみたら微妙なコードになっちゃいましたが、PHP7なら純粋な配列になるのでそこそこ速そうです。

PHP

1<?php 2function jp_lang_of($prefix) { 3 $codes = ['af','ar'...]; // 予め昇順に 4 $langs = ['アフリカーンス','アラビア'...]; // こちらもindex値を揃える 5 6 $index = 0; // クイックソートでindexを探す 7 return $langs[$index]; 8}

ひらめきました。

PHP

1function lang() { 2 return 'アラビア語'; 3}

config/langディレクトリの中にar.phpのようなファイルを生成して、includeで呼び出せばいいのです。
1回きりの処理なら間違いなしで最速です。

投稿2016/04/11 23:31

編集2016/04/11 23:49
miyabi-sun

総合スコア21158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問