【问题标题】:How to include sort function into parsed table?如何将排序函数包含到解析表中?
【发布时间】: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 表格(例如,使用 SimpleXMLDOMDocument),使用 PHP 执行某些操作,然后再次打印出来?或者您是从 PHP 生成 HTML 表吗?
  • 目前使用 simple_html_dom。
  • 请向我们展示您的尝试、预期结果和您目前得到的结果。

标签: php sorting html-table html-parsing


【解决方案1】:

更新

您必须遍历 $results 数组,然后遍历每个玩家的结果以输出您想要的数据。这应该可以。

 $str =  "<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>
<tr><td CLASS=tdp>SG</td><td CLASS=tdp>Jamal Murray</td><td>19</td><td>39</td><td>47</td><td>21</td><td>88</td><td>63</td><td>33</td><td>14</td><td>29</td><td>30</td><td>42</td><td>61</td><td>13</td><td>7</td><td>5</td><td>3</td><td>3</td><td>5</td><td>4</td><td>3</td><td>5</td></tr>
<tr><td CLASS=tdp>SF</td><td CLASS=tdp>Luol Deng</td><td>31</td><td>32</td><td>43</td><td>13</td><td>73</td><td>36</td><td>31</td><td>27</td><td>48</td><td>16</td><td>45</td><td>82</td><td>13</td><td>5</td><td>3</td><td>4</td><td>1</td><td>7</td><td>6</td><td>5</td><td>6</td></tr>
<tr><td CLASS=tdp>SF</td><td CLASS=tdp>Dante Cunningham</td><td>29</td><td>19</td><td>58</td><td>5</td><td>59</td><td>36</td><td>39</td><td>21</td><td>41</td><td>7</td><td>33</td><td>90</td><td>17</td><td>8</td><td>2</td><td>4</td><td>1</td><td>5</td><td>4</td><td>4</td><td>5</td></tr>
<tr><td CLASS=tdp>PF</td><td CLASS=tdp>Thomas Robinson</td><td>25</td><td>55</td><td>54</td><td>32</td><td>47</td><td>0</td><td>0</td><td>83</td><td>67</td><td>15</td><td>57</td><td>55</td><td>14</td><td>4</td><td>4</td><td>9</td><td>1</td><td>9</td><td>5</td><td>9</td><td>5</td></tr>
<tr><td CLASS=tdp>PF</td><td CLASS=tdp>Ryan Kelly</td><td>24</td><td>38</td><td>45</td><td>32</td><td>69</td><td>23</td><td>14</td><td>25</td><td>58</td><td>12</td><td>34</td><td>79</td><td>19</td><td>1</td><td>3</td><td>7</td><td>1</td><td>7</td><td>4</td><td>6</td><td>5</td></tr>
<tr><td CLASS=tdp> C</td><td CLASS=tdp>Dewayne Dedmon</td><td>27</td><td>33</td><td>62</td><td>20</td><td>70</td><td>0</td><td>0</td><td>57</td><td>79</td><td>10</td><td>36</td><td>73</td><td>43</td><td>5</td><td>3</td><td>9</td><td>1</td><td>8</td><td>5</td><td>9</td><td>4</td></tr>
<tr><td CLASS=tdp> C</td><td CLASS=tdp>Robert Sacre</td><td>26</td><td>38</td><td>41</td><td>33</td><td>66</td><td>0</td><td>0</td><td>56</td><td>34</td><td>12</td><td>15</td><td>80</td><td>28</td><td>1</td><td>4</td><td>7</td><td>3</td><td>5</td><td>2</td><td>7</td><td>2</td></tr>
<tr><td CLASS=tdp>SG</td><td CLASS=tdp>Vince Carter</td><td>40</td><td>19</td><td>42</td><td>20</td><td>77</td><td>54</td><td>38</td><td>12</td><td>33</td><td>23</td><td>47</td><td>83</td><td>20</td><td>7</td><td>3</td><td>4</td><td>2</td><td>5</td><td>4</td><td>3</td><td>5</td></tr>
<tr><td CLASS=tdp>SF</td><td CLASS=tdp>Nicolas Brussino</td><td>23</td><td>13</td><td>50</td><td>11</td><td>77</td><td>51</td><td>31</td><td>27</td><td>34</td><td>24</td><td>39</td><td>74</td><td>13</td><td>5</td><td>4</td><td>3</td><td>1</td><td>6</td><td>4</td><td>4</td><td>5</td></tr>
<tr><td CLASS=tdp>PF</td><td CLASS=tdp>Drew Gooden</td><td>34</td><td>31</td><td>42</td><td>12</td><td>64</td><td>38</td><td>17</td><td>50</td><td>49</td><td>11</td><td>31</td><td>77</td><td>31</td><td>1</td><td>3</td><td>4</td><td>1</td><td>6</td><td>3</td><td>7</td><td>3</td></tr>
</table>";

$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];

}

$header = $rows[0][0]; //<----Added this.

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;

  }

}

 echo
'<table>';

echo $header; //<--Changed to this.

foreach($results as $key){

  echo
  '<tr>';

    foreach($key as $k=>$v){

      echo
      '<td>' . $v . '</td>';

    }

  echo
  '</tr>';

}

echo
'</table>';

【讨论】:

  • 谢谢。有两件事: 1] 列 0 应按定义的顺序排序:PG = 1 | SG = 2 | SF = 3 | PF = 4 | C = 5。现在它不响应位置变化,例如哈登从PG到C,这应该会把他带到施罗德后面。但是第 4 列的部分工作正常。 2] 将它放在我的基本代码中的什么位置?
  • 你能给我更多的数据样本吗
  • 当然。编辑了问题。正如您在表格末尾看到的那样,有些玩家应该与其他处于相同位置的玩家进行排序。并且所有位置相同的玩家都应该按第4列排序。
  • @Chris 我更新了我的答案。看看这是否有帮助.. 我对 pos 的排序顺序仍然有点粗略。不过,此更新确实保留了您发布的关系。
  • @Chris 我的代码出错了。我已经用新的编辑更新了代码。我切换了striptags和trim函数的顺序。我也发布了新结果。告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多