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

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

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

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

Q&A

解決済

2回答

2357閲覧

PHPのコードを美しく、コンパクトにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2015/07/14 06:56

編集2015/07/14 07:02

まだまだ共通化や整形できそうな部分が多いと感じるのですが、
どのように変更すれば美しくなるかイメージが湧いてきません...

コンパクトにする上で、考え方やサンプルをご教授頂きたいです。

lang

1// バイトサイズ相互変換 byte <-> KB,MB,GB,TB 2function filesizeConvert($size) { 3 4 $size = trim($size); 5 6 $list = array( 7 'B' => 1, 8 'KB' => 1024, 9 'MB' => pow(1024, 2), 10 'GB' => pow(1024, 3), 11 'TB' => pow(1024, 4), 12 'PB' => pow(1024, 5), 13 ); 14 15 if (strlen(floatval($size)) === strlen($size)) { 16 // byte -> MB,GB... 17 // 1073741824 -> 1GB 18 19 $size = floatval($size); 20 21 $list = array_reverse($list); 22 23 // byte -> MB,GB... 24 // 1073741824 -> 1GB 25 foreach($list as $capacity => $pow) { 26 if($size >= $pow) { 27 $size = $size / $pow; 28 $size = str_replace(".", "," , strval(round($size, 2))) . $capacity; 29 return (string)$size; 30 } 31 } 32 } else { 33 // MB,GB... -> byte 34 // 1GB -> 1073741824 35 36 array_shift($list); 37 38 // MB,GB... -> byte 39 // 1GB -> 1073741824 40 foreach($list as $capacity => $pow) { 41 if (stristr($size, $capacity)) { 42 $size = $size * $pow; 43 $size = str_replace(".", "," , strval(round($size, 2))); 44 return (string)$size; 45 } 46 } 47 } 48 49 return false; 50}

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

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

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

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

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

guest

回答2

0

ngyukiさんもコメントされていますが、文字列からバイト数への変換とバイト数から文字列への変換は別にしたほうがよいと思います。関数、メソッドにはいろんなことをやらせずひとつの仕事に集中させてあげましょう!

投稿2015/07/14 12:47

Wintermoon32

総合スコア12

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

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

0

ベストアンサー

ぱっと見で気になって気になってしかたがないのがここ。

lang

1$list = array( 2 'B' => 1, 3 'KB' => 1024, 4 'MB' => pow(1024, 2), 5 'GB' => pow(1024, 3), 6 'TB' => pow(1024, 4), 7 'PB' => pow(1024, 5), 8);

ここはシフト演算を使うほうが良いと思います。

lang

1$list = array( 2 'B' => 1 << 0, 3 'KB' => 1 << 10, 4 'MB' => 1 << 20, 5 'GB' => 1 << 30, 6 'TB' => 1 << 40, 7 'PB' => 1 << 50, 8);

また、このままだと関数が呼ばれるたびに値が計算されてしまうので、static を付けるといいでしょうか。

lang

1static $list = array( 2 'B' => 1 << 0, 3 'KB' => 1 << 10, 4 'MB' => 1 << 20, 5 'GB' => 1 << 30, 6 'TB' => 1 << 40, 7 'PB' => 1 << 50, 8);

このコード、int が 32 ビットの状況を想定していますね? Windows で実行しているのでしょうか?(Windows は 64 ビット OS でも PHP の int は 32 ビットのため)

↑のわたしのコードは Windows 上だと正常に動作しません。

PHP がどれぐらい Windows 上で実行されているか判りませんが、もう 64 ビットの Linux 前提にしてしまった方が楽だと思います(どうしてもそうせざるを得ない要件が無い限り)。

そもそも PHP 7 では Windows 64 ビット環境での int が 32 ビットの問題も解決するらしいですし(まだわたしは検証していませんけれども)。


と、思ったのですが、ちょっと勘違いしていたかもしれません。すみません。。。。

投稿2015/07/14 07:12

編集2015/07/14 07:23
ngyuki

総合スコア4514

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

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

退会済みユーザー

退会済みユーザー

2015/07/14 07:39 編集

大変勉強になります、listがすっきりしました! >このコード、int が 32 ビットの状況を想定していますね? MacBookAir で開発中ですが、intのビット数まで考えておりませんでした...
ngyuki

2015/07/14 08:17

もう一つ気になったのが、「単位付き文字列 → バイト数」と「バイト数 → 単位付き文字列」を一つの関数で両方に対応していますが、別々の関数にした方が良いと思います。 32 ビットうんぬんはわたしの勘違いです。
退会済みユーザー

退会済みユーザー

2015/07/16 04:39

ありがとうございます。 別機能として切り分けたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問