如何从文件(PHP)中排序数组?

时间:2009-08-07 07:22:42

标签: php

我这里有一个文件,其中包含数据库名称列表及其对应的大小。 现在我想要从最大到最小的大小和数据库名称进行排序 应该继续展示。在这里使用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名称怎么样?

非常感谢答案。 =)

4 个答案:

答案 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)

您是否考虑过解析为二叉搜索树结构而不是数组?这样你就可以用树遍历对数据进行排序,你也可以快速查找。