2009-08-07 4 views
3

여기에 데이터베이스 이름 목록과 해당 크기가 포함 된 파일이 있습니다. 이제 최대 크기에서 가장 작은 크기로 정렬하고 데이터베이스 이름 을 표시해야합니다. 여기 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 

참고 : $ 데이터 [1] 크기가 포함되어 있습니다. 배열에 배치해야합니까? db 이름은 어때?

답변은 대단히 감사하겠습니다. =)

답변

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': $ 크기 * = 1024; case 'KB': $ 크기 * = 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을 볼 수 있습니다.

편집 : 디부 오, 당신은 여기에 file() PHP 함수를 사용할 수 있습니다

+0

부차적 인 점이지만 내림차순 정렬보다는 오름차순 정렬을 수행했습니다. –

+0

코드 복사 및 붙여 넣기가 항상 바보 같은 행위입니다. –

2

:-) 몇 초에 의해 구타. 난 당신이 배열에 PHP 기본 기능을 사용할 수 있다고 생각

DatabaseName 300 KB 
DatabaseName 300 KB 
DatabaseName 300 KB 
DatabaseName 300 KB 

: 같은

텍스트 파일입니다.

$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

배열 대신 이진 검색 트리 구조로 구문 분석을 고려 했습니까? 그렇게하면 트리 탐색으로 데이터를 정렬 할 수 있고 빠른 검색도 할 수 있습니다.

관련 문제