2013-06-22 5 views
-1

usort() 함수를 통해 더 긴 PHP 배열을 처리하는 데 문제가 있습니다. "1.1", "2.3", "1.1.2", "3.1", 30, "3.10"과 같은 40-50 요소로 배열을 정렬하려고합니다 ... 일부 요소 만 진행하면 모든 것이 작동합니다 벌금.PHP - usort 함수가 너무 느립니다.

function mySort($a,$b) { 
    $a_arr = explode(".",$a); 
    $b_arr = explode(".",$b); 

    if ($a_arr[0] < $b_arr[0]) {return -1;break;} 
    if ($a_arr[0] > $b_arr[0]) {return 1;break;} 

    for($i=0;$a_arr[$i]==$b_arr[$i];$i++){ 
     if ($a_arr[$i+1] < $b_arr[$i+1]) {return -1;break;} 
     if ($a_arr[$i+1] > $b_arr[$i+1]) {return 1;break;} 
    } 
    } 

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10"); //example, I take this data from the database 

usort($sort_array,"mySort"); 

... 누군가가 수 :

내 코드는 ... 너무 느려, 그것도 90 초 타임 아웃을 무시하는 것이 - 나는 40 개 요소의 배열이있는 경우 그러나,이 함수는 단순히 너무 느립니다 도와주세요? 이 문제를 해결할 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

미리 감사드립니다.

+1

정확히 당신이 뭘'break'을 (귀하의 샘플은 하나 개의 통지를 제공합니다)? 코드에는 이미'return'ed가있을 것이고 휴식은 절대로 실행될 수 없습니다. –

+0

'for' 루프는 무엇입니까? 나는 그것을 얻지 못한다 ... 당신의 정렬 알고리즘이 무엇을해야 하는지를 설명 할 수 있겠는가? 원하는 출력을 공유하십시오. – elclanrs

+1

version_compare()를 사용하면 서브 어레이로의 분해가 더 효율적이되지 않겠습니까? –

답변

1

배열에 동일한 값이 있으면 루프가 종료되지 않습니다. 어딘가에 return 0 절을 추가하여 배열의 두 요소가 같을 때 나타냅니다.

목록 (a, b) 중 하나에 대한 요소가 부족할 때 발생합니다. 그렇지 않으면 존재하지 않는 배열 인덱스에 액세스하는 것에 대한 통지를 받게됩니다.

+0

... 나 같은 어리석은 실수. 고마워. –

2
function mySort($a,$b) { 
    return version_compare($a,$b); 
} 

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10");  
usort($sort_array,"mySort"); 

var_dump($sort_array); 

또는 거기에도 단순히

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10");  
usort($sort_array,"version_compare"); 

var_dump($sort_array); 
+0

Yeap. 잘 작동합니다. 고맙습니다! –