运行以下 PHP 脚本:
<?php
function fixCities($better_row){
$res = trim(preg_replace('/\s+/', ' ',$better_row));
$pieces = explode(" ",$res);
$num = count($pieces);
switch( $num )
{
case 9:
$temp = array($pieces[0]." ". $pieces[1]);
array_splice($pieces, 0, 2,$temp);
break;
case 10:
$temp = array($pieces[0]." " .$pieces[1] . " " .$pieces[2]);
array_splice($pieces,0,3,$temp);
break;
default:
// 8 col table;
}
return $pieces;
}
$arr = file("whspdel.txt");
foreach($arr as $e){
$lines[] = preg_replace('!\s!', ',', $e);
}
echo <<<THEAD
<table cellpadding=0 cellspacing=0>
<thead><th>Location</th><th>State</th><th>High</th><th>Low</th><th>Days Clear</th>
<th>Days Cloudy</th><th>Days with Preceipitation</th><th>Days with Snow</th>
THEAD;
$data = array_map("str_getcsv", $lines);
foreach($data as $row) {
$i=0;
echo "<tr>\n";
$better_row = join(" ",$row);
$split = fixCities($better_row);
foreach ($split as $e) {
if ($e == "") continue;
if ($i==0){
echo "<td class='left'>",$e,"</td>";
$i++;
}
else
{
echo "<td class='phpcolor'>",$e,"</td>";
}
}
echo "</tr>\n";
}
echo "</table>\n";
?>
将 OP 的文本文件转换为 HTML 表格,如下图所示:
<html>
<head>
<style>
table {
width:80%;
border:1px solid #fff;
box-shadow: -18px -8px 20px #ccc;
margin-left:13%;
}
tr {
width: 100%;
}
td {
background:transparent;
width:10%;
border-top:1px solid #003;
border-right:none;
border-left:none;
font: 62% Arial,Helvetica;
padding:6px;
text-align:right;
}
th {
font: 62% Arial,Helvetica;
}
.left {
text-align:left;
background:#ffdede;
}
.phpcolor {
background:#ccccff;
}
</style>
</head>
<body>
<table cellpadding=0 cellspacing=0>
<thead><th>Location</th>
<th>State</th><th>High</th><th>Low</th><th>Days Clear</th>
<th>Days Cloudy</th><th>Days with Preceipitation</th><th>Days with Snow</th>
<tr>
<td class='left'>Lander</td><td class='phpcolor'>WY</td><td class='phpcolor'>5557</td><td class='phpcolor'>99</td><td class='phpcolor'>-35</td><td class='phpcolor'>109</td><td class='phpcolor'>140</td><td class='phpcolor'>67</td></tr>
<tr>
<td class='left'>Milwaukee</td><td class='phpcolor'>WI</td><td class='phpcolor'>672</td><td class='phpcolor'>98</td><td class='phpcolor'>-7</td><td class='phpcolor'>79</td><td class='phpcolor'>177</td><td class='phpcolor'>124</td></tr>
<tr>
<td class='left'>Seattle</td><td class='phpcolor'>WA</td><td class='phpcolor'>400</td><td class='phpcolor'>94</td><td class='phpcolor'>12</td><td class='phpcolor'>55</td><td class='phpcolor'>233</td><td class='phpcolor'>163</td></tr>
<tr>
<td class='left'>Spokane</td><td class='phpcolor'>WA</td><td class='phpcolor'>2356</td><td class='phpcolor'>98</td><td class='phpcolor'>-16</td><td class='phpcolor'>95</td><td class='phpcolor'>187</td><td class='phpcolor'>112</td></tr>
<tr>
<td class='left'>Burlington</td><td class='phpcolor'>VT</td><td class='phpcolor'>332</td><td class='phpcolor'>91</td><td class='phpcolor'>6</td><td class='phpcolor'>54</td><td class='phpcolor'>217</td><td class='phpcolor'>168</td></tr>
<tr>
<td class='left'>Norfolk</td><td class='phpcolor'>VA</td><td class='phpcolor'>24</td><td class='phpcolor'>98</td><td class='phpcolor'>19</td><td class='phpcolor'>85</td><td class='phpcolor'>145</td><td class='phpcolor'>117</td></tr>
<tr>
<td class='left'>Richmond</td><td class='phpcolor'>VA</td><td class='phpcolor'>164</td><td class='phpcolor'>101</td><td class='phpcolor'>16</td><td class='phpcolor'>105</td><td class='phpcolor'>165</td><td class='phpcolor'>115</td></tr>
<tr>
<td class='left'>Salt Lake City</td><td class='phpcolor'>UT</td><td class='phpcolor'>4221</td><td class='phpcolor'>103</td><td class='phpcolor'>-11</td><td class='phpcolor'>129</td><td class='phpcolor'>152</td><td class='phpcolor'>86</td></tr>
<tr>
<td class='left'>Dallas</td><td class='phpcolor'>TX</td><td class='phpcolor'>551</td><td class='phpcolor'>106</td><td class='phpcolor'>10</td><td class='phpcolor'>130</td><td class='phpcolor'>152</td><td class='phpcolor'>89</td></tr>
<tr>
<td class='left'>Houston</td><td class='phpcolor'>TX</td><td class='phpcolor'>96</td><td class='phpcolor'>104</td><td class='phpcolor'>19</td><td class='phpcolor'>73</td><td class='phpcolor'>166</td><td class='phpcolor'>94</td></tr>
<tr>
<td class='left'>San Antonio</td><td class='phpcolor'>TX</td><td class='phpcolor'>788</td><td class='phpcolor'>102</td><td class='phpcolor'>16</td><td class='phpcolor'>90</td><td class='phpcolor'>165</td><td class='phpcolor'>83</td></tr>
<tr>
<td class='left'>Memphis</td><td class='phpcolor'>TN</td><td class='phpcolor'>258</td><td class='phpcolor'>101</td><td class='phpcolor'>12</td><td class='phpcolor'>121</td><td class='phpcolor'>151</td><td class='phpcolor'>112</td></tr>
<tr>
<td class='left'>Huron</td><td class='phpcolor'>SD</td><td class='phpcolor'>1281</td><td class='phpcolor'>100</td><td class='phpcolor'>-30</td><td class='phpcolor'>121</td><td class='phpcolor'>147</td><td class='phpcolor'>80</td></tr>
<tr>
<td class='left'>Rapid City</td><td class='phpcolor'>SD</td><td class='phpcolor'>3162</td><td class='phpcolor'>106</td><td class='phpcolor'>-30</td><td class='phpcolor'>106</td><td class='phpcolor'>127</td><td class='phpcolor'>95</td></tr>
</table>
</body>
</html>
数据的挑战之一是它不是 CSV 格式。一些项目后跟多个空格字符,而其他项目则有一个或两个。所以,我的第一个想法是减少这些字符,然后将文档转换为 CSV 格式。
使用 array_map() 提供了极大的便利:避免了构建 for 循环,并且可以快速地将 str_getcsv() 应用于文本文件的每一行。
preg_replace() 非常有助于替换过多的空白字符,HTML 实体 &nbsp; 可以方便地用于包含多个单词的城市名称。
我还使用heredoc 来获得优势
更新:
fixCities() 现在为不对齐的城市提供了更有用的修复,因为它们的名称由两个或三个单词组成。从@Chizzele 那里得到了关于拼接以使城市名称正确对齐的提示。