【发布时间】:2018-04-12 20:10:24
【问题描述】:
我想通过它的两列对已解析的 html 表(通过 simple_html_dom)进行排序,并且在回显之前按特定顺序对某些部分进行排序。它的第一列带有<th>pos</th> 和<td's>,其中包含“PG”“SG”“SF”“PF”和“C”的篮球位置。在第二级,它应该按包含注射量的第 4 列排序(th = 2ga
, td 是数字)
这应该是顺序:
first priority: "pos" = 0 "PG" = 1 "SG" = 2 "SF" = 3 "PF" = 4 "C" = 5.
second priority: "2ga" = 0, numbers descending, biggest value at first
我检查了 php 必须提供的各种排序功能,但老实说,我对它的深度有点不知所措,因为我对 php 有点陌生。这里以源代码为例:
<table><hr>
<tr><th>po</th><th>player</th><th>age</th><th>2ga</th><th>2g%</th><th>fta</th><th>ft%</th><th>3ga</th><th>3g%</th><th>orb</th><th>drb</th><th>ast</th><th>stl</th><th>to</th><th>blk</th><th>o-o</th><th>d-o</th><th>p-o</th><th>t-o</th><th>o-d</th><th>d-d</th><th>p-d</th><th>t-d</th></tr>
<tr><td CLASS=tdp>PG</td><td CLASS=tdp>James Harden</td><td>27</td><td>48</td><td>53</td><td>95</td><td>85</td><td>85</td><td>35</td><td>20</td><td>59</td><td>99</td><td>57</td><td>1</td><td>12</td><td>4</td><td>9</td><td>7</td><td>9</td><td>8</td><td>6</td><td>5</td><td>7</td></tr>
<tr><td CLASS=tdp>PG</td><td CLASS=tdp>Dennis Schroder</td><td>23</td><td>68</td><td>49</td><td>32</td><td>85</td><td>39</td><td>34</td><td>10</td><td>25</td><td>65</td><td>42</td><td>35</td><td>6</td><td>8</td><td>8</td><td>2</td><td>6</td><td>5</td><td>4</td><td>2</td><td>6</td></tr>
<tr><td CLASS=tdp>SG</td><td CLASS=tdp>Evan Fournier</td><td>24</td><td>46</td><td>49</td><td>39</td><td>81</td><td>53</td><td>36</td><td>12</td><td>23</td><td>29</td><td>41</td><td>61</td><td>1</td><td>7</td><td>5</td><td>4</td><td>4</td><td>5</td><td>4</td><td>2</td><td>6</td></tr>
... more rows ...
</table>
我目前被困在这一点上。我特别不知道我必须把排序功能放在哪里。
$table = $html->find('table', 1);
$rowData = array();
// Loop
foreach($table->find('tr') as $row) {
// initialize array to store the cell data from each row
$roster = array();
foreach($row->find('td') as $cell) {
// push the cell's text to the array
$roster[] = $cell->innertext;
}
foreach($row->find('th') as $cell) {
// push the cell's text to the array
$roster[] = $cell->innertext;
}
$rowData[] = $roster;
}
echo '<table>';
foreach ($rowData as $row => $tr) {
echo '<tr>';
foreach ($tr as $td)
echo '<td>' . $td .'</td>';
echo '</tr>';
}
echo '</table>';
一个可能的排序函数可以处理源 html 代码:
$rowData = $str;
$str = preg_replace('/\s{1,}/', ' ', $str);
preg_match_all('/<tr>(.*?)<\/tr>/', $str, $rows);
foreach($rows[1] as $row){
preg_match_all('/<td(.*?)<\/td>/', $row, $data);
$results[] = $data[0];
}
unset($results[0]);
array_walk_recursive($results, function(&$a, $b){
$a = strip_tags($a);
$a = trim($a);
});
$results = array_values($results);
for($i = 0; $i < count($results); $i++){
switch($results[$i][0]){
case 'PG':
$results[$i][0] = 1;
break;
case 'SG':
$results[$i][0] = 2;
break;
case 'SF':
$results[$i][0] = 3;
break;
case 'PF':
$results[$i][0] = 4;
break;
case 'C':
$results[$i][0] = 5;
break;
}
}
usort($results, function($a, $b){
if([$a[0], $a[4]] < [$b[0], $b[4]]){
return 1;
}elseif([$a[0], $a[4]] > [$b[0], $b[4]]){
return -1;
}else{
return 0;
}
});
for($i = 0; $i < count($results); $i++){
switch($results[$i][0]){
case 1:
$results[$i][0] = 'PG';
break;
case 2:
$results[$i][0] = 'SG';
break;
case 3:
$results[$i][0] = 'SF';
break;
case 4:
$results[$i][0] = 'PF';
break;
case 5:
$results[$i][0] = 'C';
break;
}
}
}
【问题讨论】:
-
可以添加示例代码吗?
-
是的,当然。
-
你说“解析的 html-table”;您是否正在尝试解析这些统计信息的 HTML 表格(例如,使用
SimpleXML或DOMDocument),使用 PHP 执行某些操作,然后再次打印出来?或者您是从 PHP 生成 HTML 表吗? -
目前使用 simple_html_dom。
-
请向我们展示您的尝试、预期结果和您目前得到的结果。
标签: php sorting html-table html-parsing