我这里有一个文件,其中包含数据库名称列表及其对应的大小。 现在我想要从最大到最小的大小和数据库名称进行排序 应该继续展示。在这里使用PHP .. 谁能帮我吗?
这是一个简单的代码:
$file_name = test.txt
$handle = @fopen($file_name, "r");
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$data = explode(" ",$buffer);
echo $data[1]."\n";
}
fclose($handle);
}
文件如下所示:
DatabaseName 300 KB
注意:$ data [1]包含大小。我应该把它放在阵列上吗? db名称怎么样?
非常感谢答案。 =)
答案 0 :(得分:2)
首先,您需要构建一个包含您可以实际排序的元素的数组,然后使用usort或类似的方法根据您的自定义条件执行排序。
//first build up an array of databases with a unified size in bytes, ensuring
//we account for those postfixes like KB,MB,and GB
$databases=array();
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$data = explode(" ",$buffer);
if (count($data)==3)
{
$size=$data[1];
switch ($data[2])
{
case 'KB': $size*=1024; break;
case 'MB': $size*=1024*1024; break;
case 'GB': $size*=1024*1024*1024; break;
}
$data[3]=$size;
$databases[]=$data;
}
else
{
die("Bad line in file: $buffer");
}
}
现在使用自定义比较函数进行排序,根据计算出的大小从高到低排序:
function cmp($a, $b)
{
if ($a[3] == $b[3]) {
return 0;
}
return ($a[3] < $b[3]) ? 1 : -1;
}
usort($databases, "cmp");
答案 1 :(得分:2)
您可以在此处使用file() PHP函数。
您的文字文件如下:
DatabaseName 300 KB
DatabaseName 300 KB
DatabaseName 300 KB
DatabaseName 300 KB
我认为你可以在数组上使用PHP本机函数。
$data = file('myfile.txt');
foreach($data as $one_line)
{
$db[] = explode(" ",$one_line)
//will have $db[0][0] = 'dbname';
//will have $db[0][2] = '30';
//will have $db[0][2] = 'KB';
//will have $db[1][0] = 'dbname';
//will have $db[1][3] = '30';
//will have $db[1][2] = 'KB';
}
array_multisort($db[1], SORT_NUMERIC, SORT_DESC);
在文档中查看此评论,结构相同:http://fr2.php.net/manual/en/function.array-multisort.php#79491
或许您必须翻转数组,因此您可以在索引和名称中使用值。
答案 2 :(得分:1)
function databases_sort($a, $b) {
if ($a[1] == $b[1]) { return 0; }
return ($a[1] < $b[1]) ? -1 : 1;
}
$file_name = "test.txt";
$handle = @fopen($file_name, "r");
$databases = array();
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$data = explode(" ",$buffer);
$databases[] = $data;
//echo $data[1]."\n";
}
usort($databases, "databases_sort");
foreach ($databases as $d) {
echo $d[1];
}
fclose($handle);
}
此代码将您的信息存储在一个数组中,然后在您的数组上运行自定义排序函数,并按数组中元素1的值对其进行排序。较高的值(较大的数据库大小)将排序到列表的顶部。
警告:我实际上没有测试过这段代码,但是如果有任何需要修复的错误,你可以看到usort documentation。
编辑:噢噢,殴打几秒钟: - )
答案 3 :(得分:0)
您是否考虑过解析为二叉搜索树结构而不是数组?这样你就可以用树遍历对数据进行排序,你也可以快速查找。