2013-10-02 2 views
1

알파벳순으로 정렬하려는 값의 배열이 있습니다. 그러나의 숫자는 문자 뒤에 정렬됩니다. 예를 들어PHP : 문자 뒤에 숫자가있는 배열을 정렬하십시오.

, 주어진 다음 문자열 :

Core Duo, Core 2 Duo, Core Quad, Core 4 Quad 

대신, PHP의 종류() 함수는 다음과 같이 그것을 정렬 :

Core 2 Duo, Core Duo, Core Quad, Core 4 Quad 

나는 그렇게으로 주문 끝내고 싶습니다

Core 2 Duo, Core 4 Quad, Core Duo, Core Quad 

자연 정렬은 일반 정렬과 동일한 결과를 반환합니다.

PHP에 "숫자가 발생하면 Z 다음에 오는 것처럼 정렬"할 수있는 방법이 있습니까?

+3

당신은 [에 usort] 시도해야합니다 (http://php.net/manual/en/function.usort. php) – Rob

+1

Btw,'Core 4 Quad'는 없지만'Core 2 Quad'가 있습니다. – zerkms

+1

이것은 실제로 솔직하게 말이되지 않습니다. 글자가 숫자보다 정렬 값이 높으면 왜 '코어 쿼드'는 '코어 2 듀오'와 '코어 4 쿼드'사이에 갈까요? 좀 더 일반적인 알고리즘을 결정할 수 있도록 정렬 방법을 더 크게 할 수 있습니까? – Anthony

답변

3

문자열의 숫자 요소를 모두 뒤로 밀어 넣는 함수가있는 것처럼 보입니다. "Core 2 Duo"=> "Core Duo 2".

// moves numeric parts of the string to the back 
function transform($s) 
{ 
     $parts = explode(' ', $s); 
     foreach (array_filter($parts, 'is_numeric') as $key => $value) { 
       unset($parts[$key]); 
       $parts[] = $value; 
     } 
     return join(' ', $parts); 
} 

// natural sort on transformed strings 
function cmp($a, $b) 
{ 
    return strnatcmp(transform($a), transform($b)); 
} 

$a = array('Core 2 Duo', 'Core Duo', 'Core Quad', 'Core 2 Quad'); 

usort($a, 'cmp'); 

print_r($a); 
+0

뒤쪽으로 밀어 넣으면 정말 똑똑합니다. – Anthony

1

여기에 솔루션입니다 :

<?php 

$array = array('Core 2 Duo', 'Core Duo', 'Core Quad', 'Core 4 Quad'); 

$tempArray = array(); 
foreach($array as $key=>$value) { 
    $exp = explode(" ",$value); 
    if(count($exp)==3) { 
     $tempArray[$key] = $exp[0]." ".$exp[2]." ".$exp[1]; 
    } else { 
     $tempArray[$key] = $exp[0]." ".$exp[1]." "."-1"; 
    } 
} 

asort($tempArray); 

$sortedArray = array(); 
foreach($tempArray as $key=>$value) { 
    $sortedArray[] = $array[$key]; 
} 

print_r($sortedArray); 

?> 

출력 :

Array 
(
    [0] => Core Duo 
    [1] => Core 2 Duo 
    [2] => Core Quad 
    [3] => Core 4 Quad 
) 
관련 문제