1

csv形式は次のとおりです。

ServerA,OK,app1
ServerB,OK,app2
ServerC,OK,app3
ServerD,,app4
ServerA,OK,app2
ServerB,,app3
ServerC,OK,app1
ServerD,OK,app2
ServerA,OK,app3
ServerB,OK,app1
ServerC,,app2

私が表示したいのは:

Server:     App1:     App2:  App3:  App4
ServerA      OK        OK     OK     OK
SERverB      OK        OK     N/A    OK

2番目のフィールドが空の場合は、N/Aを表示します。

これは私が試したものです:

$file = "serverdata.txt";
$fp = fopen($file, "r") or die("Can't open file serverdata.txt");


while(!feof($fp)) {
    $data = fgets($fp, 1024);
    $navData = explode(',',$data);

            $host = $navData[0];
            $app = $navData[2];
            $status = $navData[1];
            $myData[$host][$app] = $status;


}


foreach ($myData as $tempHost) {
if (isset($myData[$tempHost]['app1'])) {
          $App1_status =  $mydata[$tempHost]['app1'];
    }
    else {
           $App1_status = "N/A";
    }

.
.
.
.
<same for all other apps status >

print "<TD>$tempHost</TD><TD>$App1_status</TD><TD>$App2_status</TD><TD>$App3_status</TD>  <TD>$App4_status</TD></TR>\n";
}


}

それがうまくいくようには見えません、どんな助けもいただければ幸いです。

4

4 に答える 4

3

アプリケーションには基本的に2つの部分があります。最初の部分は、ファイルを読み込んでデータをメモリに保存することです。あなたは実際にこれをかなりうまくやりました。私は主に私の例では異なる変数名のみを使用しSplFileObjectており、コンマで区切られた値をすでに解析しているため、を使用しています。

$file = new SplFileObject('serverdata.txt');
$file->setFlags(SplFileObject::READ_CSV);
$hosts = array();
$apps = array();
foreach($file as $line) {
    list($host, $status, $app) = $line;
    $apps[$app] = 1;
    $hosts[$host][$app] = $status;
}

各行は、、およびに解析さ$host$statusます$app。私はあなたがしたようにメインデータを保存します(ここでは$hosts)。また、アプリ名をと呼ばれる別の配列に保存して、後でホストアプリ$appsに基づいてマトリックスを作成できるようにします。アプリケーション名をキーとして保存します。これは、配列内で各キーが1回しか存在できないため、重複を削除する簡単な方法です。

次に、データを出力します。私はここでプレーンテキストでそれを行います。HTMLでそれが必要な場合は、おそらくさらに簡単です。

echo "+----------+", str_repeat('------+', count($apps)), "\n";
echo "| Server   |";
foreach($apps as $name => $v) {
    echo " $name |";
}
echo "\n", "+----------+", str_repeat('------+', count($apps)), "\n";

foreach($hosts as $host => $hostApps) {
    printf("| %' -8s |", $host);
    foreach($apps as $name => $v) {
        $value = isset($hostApps[$name]) ? $hostApps[$name] : "N/A";
        printf("  %' -3s |", $value);
    }
    echo "\n", "+----------+", str_repeat('------+', count($apps)), "\n";
}

ご覧のとおり、一方が他方foreachの中にあります。1つはすべてのホスト用で、もう1つはすべてのアプリ用です。

これにより、提供したデータの出力が作成されserverdata.txtます。

+----------+------+------+------+------+
| Server   | app1 | app2 | app3 | app4 |
+----------+------+------+------+------+
| ServerA  |  OK  |  OK  |  OK  |  N/A |
+----------+------+------+------+------+
| ServerB  |  OK  |  OK  |      |  N/A |
+----------+------+------+------+------+
| ServerC  |  OK  |      |  OK  |  N/A |
+----------+------+------+------+------+
| ServerD  |  N/A |  OK  |  N/A |      |
+----------+------+------+------+------+

この例がお役に立てば幸いです。データを出力する前に、3番目の手順を実行して配列を正規化し、各ホスト(行)にすべてのアプリのデータが既に含まれるようにすることもできます。その場合、出力を行うのはさらに簡単です。しかし、私はそれを演習のために残します。

于 2012-08-13T23:09:06.820 に答える
1
$filename = 'serverdata.txt';
$data_lines = file($filename);
$server_app_data = array();
$servers = array();
$apps = array();
foreach($data_lines as $line) {
  list($server,$status,$app) = explode(',',$line);
  $server_app_data[$server][$app] = $status;
  if(!in_array($server, $servers)) $servers[] = $server;
  if(!in_array($app, $apps)) $apps[] = $app;
}

$table_content = '<table><thead><tr><th>Server:</th>';
foreach($apps as $app) $table_content .= '<th>'.ucwords(trim($app)).':</th>';
$table_content .= '</tr></thead><tbody>';
foreach($servers as $server) {
  $table_content .= '<tr><th>'.$server.'</th>';
  foreach($apps as $app) {
    $table_content .= '<td>'.($server_app_data[$server][$app]?:'N/A').'</td>';
  }
  $table_content .= '</tr>';
}
$table_content .= '</table>';

echo $table_content;

次のテーブルを生成します。

Server:     App1:   App2:   App3:   App4:
ServerA     OK      OK      OK      N/A
ServerB     OK      OK      N/A     N/A
ServerC     OK      N/A     OK      N/A
ServerD     N/A     OK      N/A     N/A
于 2012-08-13T23:06:24.127 に答える
0

この行foreach ($myData as $tempHost)は、配列をに格納し$tempHostます。必要なのは(その後、のすべてのインスタンスをforeach ($myData as $tempHost=>$hostData)に置き換えることができます)。$myData[$tempHost]$hostData

于 2012-08-13T22:47:11.880 に答える
0
foreach ($myData as $host=>$apps) {
print "<TD>$host</TD>";
foreach($apps as $status)
    print "<TD>".($status!=""?$status:"N/A")."</TD>";
}
print "\n";
于 2012-08-13T23:07:51.007 に答える