function PCorPhone($ua){ if(mb_strpos($ua,'Android')===false){ $css = 'designPC.css'; } if(mb_strpos($ua,'iPhone')===false){ $css = 'designPC.css'; } if(mb_strpos($ua,'iPad')===false){ $css = 'designPC.css'; } if(mb_strpos($ua,'Window')===false){ $css = 'designPhone.css'; } return $css; }
PCとスマホでアクセスしたのを区別するプログラムを書いたのですが、もっと簡潔な書き方がありませんか?
アドバイスいただけると助かります。よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
PCとスマホの切り分け条件は、ユーザーエージェント(以下 UA)に、
・Android か iPhone か iPad の文字列があれば、スマホ用
・Windows があれば PC 用
でしょうか?
提示されたソースの場合、Android も iPhone も iPad も Windows もない(例えば Mac からだったり Linux 機だったり)場合、$css が未定義のままですから、意図しない表示になるはずです。
上の切り分け条件をちょっと変えて
・Android か iPhone か iPad の文字列があれば、スマホ用
・そうでなければ PC 用
であれば、こういう感じになります。
PHP
1function PCorPhone($ua) { 2 $css = 'designPC.css'; 3 if (preg_match(/(Android|iPhone|iPad)/, $ua) === 1) { 4 $css = 'designPhone.css'; 5 } 6 return $css; 7}
投稿2017/09/21 02:56
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/21 03:01
2017/09/21 04:32
0
PHP
1function PCorPhone($ua){ 2 if(mb_strpos($ua,'Window')===false){ 3 $css = 'designPhone.css'; 4 } else { 5 $css = 'designPC.css'; 6 } 7 return $css; 8}
投稿2017/09/21 02:50
総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/21 02:52
2017/09/21 02:55
2017/09/21 02:57
0
まずもって、このコードでは狙ったとおりに動きません。たとえば、macOSのSafariは以下のようなユーザーエージェントを返します。
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
最後のWindow
条件に引っかかって、パソコンなのに'designPhone.css'
を返してしまいます。
こういったものは、自分で書くより既存のライブラリを使ったほうが楽で確実だと思います。
投稿2017/09/21 02:51
総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
$cssのデフォ値が設定されていないですね
またifが排他的になっていないので常に後者で上書きされています。
基本をdesignPC.cssとして、特定の時designPhone.cssにするとよいのでは?
PHP
1 2function PCorPhone($ua){ 3 $css = preg_match('/Android|iPhone|iPad/',$ua)?'designPhone.css':'designPC.css'; 4 return $css; 5} 6```;
投稿2017/09/21 02:48
総合スコア114814
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
tacsheavenさんやyambejpさんのようなロジック変更を行った方が良いかと思いますが、
質問文のソースコードを極限までシンプルにするとこうなります。
PHP
1// この書き方は規約でアウト扱いの可能性もあり 2function PCorPhone($ua){ 3 if (mb_strpos($ua, 'Window') === false) return 'designPhone.css'; 4 return 'designPC.css'; 5}
PHP
1// その場合はこっち 2function PCorPhone($ua){ 3 if (mb_strpos($ua, 'Window') === false) { 4 return 'designPhone.css'; 5 } 6 return 'designPC.css'; 7}
所謂ガード説という対応です。
さっさとreturn返して逃げれば一時変数も使わずに済んで万々歳ですね。
おまけ
PCorPhoneという関数を見て、他の人はどういう値を返す関数と想像するでしょうか?
まぁ大多数は文字列の"PC"か"Phone"
なんだろうと想像するでしょうね。
ところが、実行すると返ってくるのが"designPC.css"
なわけですよ。
なので下のようなアプローチが良いでしょうね。
PHP
1function PCorPhone($ua){ 2 if (mb_strpos($ua, 'Window') === false) { 3 return 'Phone'; 4 } 5 return 'PC'; 6} 7 8$device = PCorPhone($ua); 9$css = "design{$device}.css";
PHP
1function isPC($ua){ 2 if (mb_strpos($ua, 'Window') === false) { 3 return false; 4 } 5 return true; 6} 7 8$device = isPC($ua) ? 'PC' : 'Phone'; 9$css = "design{$device}.css";
投稿2017/09/21 03:52
編集2017/09/21 06:30総合スコア21158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
解決しました。これで今のところ上手くいっています。ありがとうございました。
//パソコンかスマホかを判断する関数 function PCorPhone($ua){ $pattern = "/(Android|iPhone|iPad)/"; $css = 'designPC.css'; if(preg_match($pattern, $ua) === 1){ $css = 'designPhone.css'; } return $css; }
投稿2017/09/21 06:33
総合スコア22
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/21 09:23
2017/09/21 09:25
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。