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

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

ただいまの
回答率

90.61%

  • PHP

    19901questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 639

esuzuki

score 57

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

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

// バイトサイズ相互変換 byte <-> KB,MB,GB,TB
function filesizeConvert($size) {

  $size = trim($size);

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

  if (strlen(floatval($size)) === strlen($size)) {
    // byte -> MB,GB...
    // 1073741824 -> 1GB

    $size = floatval($size);

    $list = array_reverse($list);

    // byte -> MB,GB...
    // 1073741824 -> 1GB
    foreach($list as $capacity => $pow) {
      if($size >= $pow) {
          $size = $size / $pow;
          $size = str_replace(".", "," , strval(round($size, 2))) . $capacity;
          return (string)$size;
      }
    }
  } else {
    // MB,GB... -> byte
    // 1GB -> 1073741824

    array_shift($list);

    // MB,GB... -> byte
    // 1GB -> 1073741824
    foreach($list as $capacity => $pow) {
      if (stristr($size, $capacity)) {
        $size = $size * $pow;
        $size = str_replace(".", "," , strval(round($size, 2)));
        return (string)$size;
      }
    }
  }

  return false;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

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

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

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

$list = array(
    'B'  => 1 << 0,
    'KB' => 1 << 10,
    'MB' => 1 << 20,
    'GB' => 1 << 30,
    'TB' => 1 << 40,
    'PB' => 1 << 50,
);

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

static $list = array(
    'B'  => 1 << 0,
    'KB' => 1 << 10,
    'MB' => 1 << 20,
    'GB' => 1 << 30,
    'TB' => 1 << 40,
    'PB' => 1 << 50,
);


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

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

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

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


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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/14 16:38 編集

    大変勉強になります、listがすっきりしました!

    >このコード、int が 32 ビットの状況を想定していますね?
    MacBookAir で開発中ですが、intのビット数まで考えておりませんでした...

    キャンセル

  • 2015/07/14 17:17

    もう一つ気になったのが、「単位付き文字列 → バイト数」と「バイト数 → 単位付き文字列」を一つの関数で両方に対応していますが、別々の関数にした方が良いと思います。

    32 ビットうんぬんはわたしの勘違いです。

    キャンセル

  • 2015/07/16 13:39

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 受付中

    phpでの置換

    以下の様な文字列があったとします。 ほげ{{1}} ほげ{{2}} これを以下のように置換したいと思っています。 ほげいち ほげに その際にいちとには以下の変数を使いたいです。

  • 解決済

    PHPで、文字列の冒頭部分を一部取り除くにはどうしたらいいでしょうか?

    わたしはこのような文字列を作成しました。 $str = "なんとか_かんとか_なんとか_なんとか_なんとか"; 最初の「なんとか_」を取り除くにはどうしたらよいでしょうか? s

  • 解決済

    PHPの関数で、正規表現以外で特定の文字列を取得する方法

    PHPで、二つの文字列に囲まれている文字列を返す関数を教えて下さい。 strposとsubstrの関数を使うことを考えています。 正規表現系の関数を使わずに、PHPの関数のみを使

  • 解決済

    PHPでWeb上で文字列を安全なURLへ変換する方法を教えてください。

    特殊文字が入っている文字列をURLに変換するのに、安全な方法が知りたいです。 いつもは変換したい特別記号が入っている文字列があった場合、特別記号を手動で見つけて配列に入れています。

  • 解決済

    phpでタブ区切りテキストファイルを1行目をキーの連想配列にしたい

    下記のようなタブ区切りのテキストファイルを 1行目だけをキーにした連想配列にしたいのですが 良い方法はありますでしょうか? record.txt(実際のファイルは50列くらいあり

  • 受付中

    PHPの問題

    2010/09/01 2010/10/12 2010/8/2 2010/10/2 2010/5/12 を 2010/09/01 2010/10/12 2010/08/02 20

  • 解決済

    練習問題02

    seiseki.tsv 名前 国語 算数 理科 社会 山田 90 89 78 77 加藤 50 80 43 89 斎藤 11 34 55 77

  • 解決済

    phpエクセルで配列に格納

    お世話になります。 現在、phpExcelを少し勉強しており、わからないことがあるのでご質問させてください。 あるエクセルファイルに店舗情報などが入っており、その中の項目に表示、

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

  • PHP

    19901questions

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