PHP 按类在表中重新使用 tr


PHP resorting tr's in a table by class

我有一个相当大的表格,我用php调用把它放在页面上

<?php include('7c2dsf12c24-4441e-532ded8-88dsc7-4fsd2c8.txt'); ?>

该文件包含数千个 TR 和 TD。文本文件每隔几个小时动态创建和更新一次。

某些行上有一个"featuredRow"类,这有助于样式设置。但是,它们在该文本文件中以随机顺序显示。

我需要对它们进行排序,以便将特色行排在第一位。基本上,获取所有行,并将所有精选行放在表的顶部,然后是所有其他行。

我已经有 javascript 代码可以按不同的 td 字母顺序对表进行排序,但由于它是前端排序,并且表由数千个 tr 组成(文本文件是 7mb 的文本),如果我最初要过滤它,这对 Internet Explorer 来说是一个相当大的压力(用户希望在重新排序整个表时等待很长时间, 但是他预计不会等待 30 秒,直到一切都正确排序(Chrome 上只有 2-3 秒,在 IE 上为 20-30 秒))。

因此,我认为在后端执行此操作并立即显示重新排序的文本文件会更好,而不是使用 dom,以创建巨大的数组并滞后用户的浏览器。

TL/DR例如,文件的结构如下所示:

<tr><td></td><td></td></tr>
<tr class="featuredRow"><td></td><td></td></tr>
<tr><td></td><td></td></tr>
<tr><td></td><td></td></tr>
<tr class="featuredRow"><td></td><td></td></tr>
<tr class="featuredRow"><td></td><td></td></tr>
<tr><td></td><td></td></tr>
<tr class="featuredRow"><td></td><td></td></tr>
<tr><td></td><td></td></tr>

我需要获取该文件并将结构重新排序为:

<tr class="featuredRow"><td></td><td></td></tr>
<tr class="featuredRow"><td></td><td></td></tr>
<tr class="featuredRow"><td></td><td></td></tr>
<tr class="featuredRow"><td></td><td></td></tr>
<tr><td></td><td></td></tr>
<tr><td></td><td></td></tr>
<tr><td></td><td></td></tr>
<tr><td></td><td></td></tr>
<tr><td></td><td></td></tr>

而且我不想使用 JS,因为有数千行、兆字节的数据,并且在 IE 上需要很长时间才能在前端执行此操作。

让它在 PHP 中工作的最简单方法是什么?

谢谢

附言这是html/php现在的样子 - jsfiddle.net/1pggwuah

这是另一个关于文本文件的两个 tr 外观的链接(文本文件中大约有 3,000-4,000 个这样的 trs)jsfiddle.net/a308w8b6

$rows = file_get_contents('/path/to/rows.html');
$rows = explode('<tr', $rows);
sort($rows);
$rows = implode('<tr', $rows);

演示:https://ideone.com/bITopF

$domd=@DOMDocument::loadHTMLFile('7c2dsf12c24-4441e-532ded8-88dsc7-4fsd2c8.txt');
$masterele=$domd->getElementsByTagName("table")->item(0);
foreach($domd->getElementsByTagName("tr") as $trele){
if($trele->getAttribute("class")!=="featuredRow"){continue;}
$trele->parentNode->removeChild($trele);
$masterele->insertBefore($trele,$masterele->firstChild);
}
echo $domd->saveHTML();

编辑:原始代码会将"featuredRow"放在底部,而不是顶部,抱歉,现在修复了它(使用insertBefore而不是append)