Как отсортировать массив из файла (PHP)? - PullRequest
3 голосов
/ 07 августа 2009

У меня есть файл, который содержит список имен баз данных и соответствующий ему размер. Теперь я хочу отсортировать размер от самого большого до самого низкого и имя базы данных должен идти по нему при отображении. Используем 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] содержит размеры. Должен ли я поместить его в массив? как насчет имени БД?

Ответы очень ценятся. =)

Ответы [ 4 ]

2 голосов
/ 07 августа 2009

Вы можете использовать функцию 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 голосов
/ 07 августа 2009

Сначала вам нужно построить массив с элементом, по которому вы действительно можете отсортировать, затем используйте 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 голос
/ 07 августа 2009
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 , если есть какие-либо ошибки, которые нужно исправить.

Редактировать: d'oh, избит на несколько секунд: -)

0 голосов
/ 07 августа 2009

Задумывались ли вы о разборе в бинарную структуру поиска вместо массива?Таким образом, вы можете отсортировать данные с помощью обхода дерева, и вы также сможете быстро найти данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...