php ファイル管理と実習

uchiumiです。
今日のPHPは、ファイルの置き場所についてや、前回のソースを拡張していったりしました。

PHPファイルはどこに置く?

今日はまずファイルの置き位置について学びました。
同じディレクトリの中でずっと作業をしていると、よく使いそうな「test.php 」 や「hoge.php」といった名前のファイルが1つしか作れないので、かぶらないようにしなければいけないなど管理が大変だとのことでした。
そこで、ディレクトリにわけて管理する際の注意事項を教わりました。

主に、

  • ファイルの置き場所により参照の仕方が変わるということ
  • 実行時のカレントディレクトリを把握しとくとくこと

とのことでした。
なぜかというと、同じディレクトリの中にあるファイルを参照するときは、そのファイル名を書いてあげれば良いのですが、もし違うディレクトリにある場合は、ファイル名でなく、そのファイルがあるディレクトリの名前も書いてあげなければならなくなるからです。
そのため、自分が今どこにいるかを把握しておく事は、正しくファイルを参照する為には、重要になる。とのことでした。

実習

次に、実習を行いました。
お題は、「各都道府県の各教科(国語,算数,英語)の平均点を表示する」というものです。
前回のソースからの拡張になりますが、いろいろ考えていると難しいところがたくさんありました。
以下、今回一番早くこのお題をクリアしたirisawaのソースです。

・メインファイル

<?php

require_once "functions.php";

$filename = "../result.csv";

if (file_exists($filename)) {
 $result = getResult($filename);
 showResult($result);

} else {
 echo "ファイルが存在しません";
}
?>

・関数ファイル

<?php

function getResult($filename){

   $rows = file($filename);
   $count = count($rows);
   $result = array();

   for ($i = 1; $i < $count; $i++) {

     $split_row = explode(",",$rows[$i]);

     $pref = $split_row[1];
     $japanese = $split_row[2];
     $math = $split_row[3];
     $english = $split_row[4];

     $result[$pref]["国語"][] = $japanese;
     $result[$pref]["算数"][] = $math;
     $result[$pref]["英語"][] = $english;

   }

   return $result;
}

function showResult($result){

 echo "<table border='1'><tr><th>都道府県</th& amp;gt;<th>国語</th><th>算数</th><th>英語</th>< /tr>";

 foreach ($result as $pref => $subject) {
   echo "<tr><td>$pref</td>";

   foreach ($subject as $point) {
     printf("<td>%.2f</td>",getAverage($point));
   }

   echo "<tr>";
 }

 echo "</table>";

}

function getAverage($point){

 //教科の平均を求める
 $average = array_sum($point)/count($point);

 return $average;

}

?>

以上です。
すっきりしていて、わかりやすいと思いました。
続いて、講師の方のソースです。
・メインファイル


require_once 'functions.php';
$lines = load();
$total = total($lines);
$result = average($total);
?>
<html>
<body>
<table border="1">
<tr>
<td></td>
<td>国語</td>
<td>算数</td>
<td>英語</td>
</tr>
<?php
foreach ($result as $pref => $average) {
?>
<tr>
<td><?php echo $pref; ?></td>
<td><?php printf("%.2f", $average['国語']); ?></td>
<td><?php printf("%.2f", $average['算数']); ?></td>
<td><?php printf("%.2f", $average['英語']); ?></td>
</tr>
<?php
}
?>
</body>
</html>

・関数ファイル

<?php
function load()
{
    $lines =  file('result.csv');
    array_shift($lines);

    return $lines;
}

function total($lines)
{
    $total = array();

    foreach ($lines as $line) {
        $parts = splitLine($line);
        if (!$parts) {
            continue;
        }

        $pref = $parts['都道府県'];

        $total[$pref]['国語'][] = $parts['国語'];
        $total[$pref]['算数'][] = $parts['算数'];
        $total[$pref]['英語'][] = $parts['英語'];
    }

    return $total;
}

function splitLine($line)
{
    $parts = explode(',', trim($line));

    if (count($parts) != 5) {
        return false;
    }

    return array(
        '都道府県' => $parts[1],
        '国語' => $parts[2],
        '算数' => $parts[3],
        '英語' => $parts[4],
    );
}

function average($total)
{
    $average = array();
    foreach ($total as $pref => $item) {
        $average[$pref]['国語'] = calcPrefAverage($item, '国語');
        $average[$pref]['算数'] = calcPrefAverage($item, '算数');
        $average[$pref]['英語'] = calcPrefAverage($item, '英語');
    }

    return $average;
}

function calcPrefAverage($item, $key)
{
    $total = array_sum($item[$key]);
    $count = count($item[$key]);
    if ($count != 0) {
        $average = $total / $count;
    } else {
        $average = 0;
    }

    return $average;
}

以上になります。
今回は自分の限界を超えた配列の使い方をしないことと、
連想配列を使って見やすく書くということを学びました。
連想配列はまだ慣れないところが多くて、数字でいいじゃん〜と思ってしまうこともありますが、わかりやすいソースを書く為に、積極的に使っていきたいと思いました。

—-
(2008/06/24 17:20 hirafuji追記)
動画をご覧下さい〜!

part.1

part.2

1 件のコメント so far »

  1. by takahashi, on 06.18.08 @ 6:49 PM

     

    処理しやすいデータ構造に持って行くというのが今回のテーマでした。
    それに併せて”後から見やすい”データ構造であればベストですよね。

    一足飛びにそこにもっていけるわけではないですから、いろいろなものを
    実際に組んでいきながらなれていくというか勘所をつかんでいくということで
    いいと思います。

Comment RSS · TrackBack URI

コメントをどうぞ

名前: (Required)

eMail: (Required)

Website:

Comment:

Spam Protection by WP-SpamFree