2009-08-07 11 views
3

ここには、データベース名とそれに対応するサイズのリストが入ったファイルがあります。 サイズを最大から最小に並べ替えると、データベース名 が表示されます。PHPを使用しています。 誰か助けてくれますか?ファイル(PHP)から配列をソートする方法は?

は、ここでそのための簡単なコードです:

DatabaseName 300 KB 

注:

$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); 
} 

ファイルは次のようになります$データ[1]のサイズが含まれています。私は配列に配置する必要がありますか?データベース名はどうですか?

回答をいただきありがとうございます。 =)

答えて

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

あなたはよりコンパクトな方法で 'switch'を書くことができます:' switch($ data [2]){case 'GB':$ size * = 1024; case 'MB':$ size * = 1024; case 'KB':$ size * = 1024; } '。 – Gumbo

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が表示されます。

編集:D'ああ、あなたがここにfile() PHP関数を使用することができます

+0

マイナーポイントですが、降順ソートではなく昇順で行っています:) –

+0

コードをコピーして貼り付けるのはいつも愚かなことです –

2

:-)数秒で殴ら。

あなたのテキストファイルは次のようである:

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

または多分を。

+0

これは素晴らしいコンパクトなソリューションですが、サイズは常にKBである必要があります(場合によってはOPが指定されていない可能性があります)。 –

+0

はい、あなたのスイッチのソリューションも面白いです。 私はPHPネイティブ関数を使いたいと思っていました。 –

0

あなたは配列ではなくバイナリ検索ツリー構造に解析することを考えましたか?そうすれば、ツリートラバーサルでソートされたデータを持つことができ、高速検索も可能になります。

関連する問題