2012-02-25 1 views
3

나는 목록을 uksort가있는 열로 정렬하려고 시도하고있다.모듈러스로 정렬

이미

배열 알파 정렬, 그것은 떠 요소로, HTML에 표시됩니다 array('A','B','C','D','E','F','G','H','I','J','K','L','M')

같은 그래서 :

A E H K 
B F I L 
C G J M 
D 
: 나는 다음과 같이 표시됩니다 그래서 다시 정렬 할

A B C D 
E F G H 
I J K L 
M 

정렬 된 배열은 다음과 같습니다. array('A','E','H','K','B','F','I','L','C','G','J','M','D'

기본적으로 Sorting a list alphabetically with a modulus과 동일하지만, php. 나는 자바 스크립트에 대한 솔루션을 복용하고 그것을 PHP로 변환하려했지만, 나는 제대로 된 것을 얻지 못하고있다. 누구든지 PHP에서 어떻게하는 방법에 대한 아이디어가 있습니까?

내가 시도 것입니다 :

function cmp_nav_by4($a, $b) { 
    if (($a % 5) < ($b % 5)) { 
     return 1; 
    } elseif (($a % 4) > ($b % 4)) { 
     return -1; 
    } else { 
     return $a < $b ? 1 : -1; 
    } 
} 
$result = uksort($thearray, "cmp_nav_by4"); 
+2

데이터는 사전 정렬 방식으로 어떻게 저장됩니까? –

+2

질문에 코드 시도를 포함해야합니다 (대부분의 경우). –

+0

이 데이터는 여기에 표시된 것처럼 배열의 배열입니까? 왜냐하면 당신은 단지 그것을 반복하고 교환하기 때문입니다. – Incognito

답변

6

이 설정 다음

각 멤버를 출력하고 인덱스 (행과 콜 럼)에 의해 열쇠뿐만 아니라 요소 주문
$array = range('A', 'M'); 
$columns = 4; 
$length = count($array); 

print_matrix($array, $columns); 

상단 :

One row - A B C D E F G H I J K L M 
A[ 0] B[ 1] C[ 2] D[ 3] 
E[ 4] F[ 5] G[ 6] H[ 7] 
I[ 8] J[ 9] K[10] L[11] 
M[12] 

연결된 자바 스크립트 코드는 쉽게 PHP로 변환 될 수 있습니다.

function callback_sort($array, $columns) 
{ 
    $sort = function($columns) 
    { 
     return function($a, $b) use ($columns) 
     { 
      $bycol = ($a % $columns) - ($b % $columns); 
      return $bycol ? : $a - $b; 
     }; 
    }; 

    uksort($array, $sort(4)); 

    return $array; 
} 

출력은 :

One row - A E I M B F J C G K D H L 
A[ 0] E[ 4] I[ 8] M[12] 
B[ 1] F[ 5] J[ 9] C[ 2] 
G[ 6] K[10] D[ 3] H[ 7] 
L[11] 

그래서 그냥 그입니다 당신이 그 질문/대답에 자세히 본다면 그러나, 그것은 단지 내 이전 시도와 같이, 전체 행이 작동하는지 분명해진다 다른 질문에서 제공된 기능이 작동하지 않습니다.

그러나 배열이 이미 정렬되었으므로 다시 정렬 할 필요는 없으며 순서 또는 요소 만 변경하면됩니다. 그러나 순서는? 행렬이 완료되지 않은 경우 (예 : n x n을 완전히 채우면 각 열마다 다른 새 색인을 계산해야합니다.

column: 1 2 3 4 
rows: 4 3 3 3 

각 열당 따라서, 차이 값이 13 개 요소 (A-M)와 예를 취해진하면 열당 행의 다음의 분포를 준다. 예를 들어 인덱스 12에서 13 번째 요소는 4 번째 행에 있습니다. 그 자리에 오는 도중, 그것은 1 열을 4 번 지나고 다른 2 ~ 4 열을 3 번 통과했습니다. 따라서 반복 인덱스의 가상 인덱스를 얻으려면 앞으로 각 인덱스에서 얼마나 많은 수의 원래 인덱스를 찾았는지 알아야합니다. 당신은 최대 구성원 수를 통해 갈 경우, 당신은 그래서이 반복적으로 인덱스를 통해 계산을 배포 할 각 인덱스에 따라 앞으로 스테핑에 의해 해결 될 수 0

에 걸쳐 계속 :

Index 0: 
    No column: 0 

Index 1: 
    1x in column is which has 4 rows: 4 

Index 2: 
    1x in column 1 (4 rows) and 1x in other columns (3 rows): 4 + 3 

을 ... 등등.

Index 4: 
    1x 4 rows and 3x 3 rows = 13 (4 + 9) 
    13 > 12 => 1 (13 - 12) 

를 이제 가상 인덱스 0로 시작하여 새 배열을 작성 : 가상 지수가 12 이상가는 경우 가상 인덱스가 13을 계산합니다 5 요소에 대한 예 (인덱스 4)의 경우, 0에서 시작됩니다 코드로 작성된

One row - A E H K B F I L C G J M D 
A[ 0] E[ 4] H[ 7] K[10] 
B[ 1] F[ 5] I[ 8] L[11] 
C[ 2] G[ 6] J[ 9] M[12] 
D[ 3] 

, 즉 간단한 foreach입니다 : 때마다 오프셋 적절한를 제공하면 원하는 출력을 줄 것이다 (약 필요한 경우 포장 당신이, 그 열의 행 번호를 추가하는 열에서 보면) 원래 색인보다

$floor = floor($length/$columns); 
$modulo = $length % $columns; 
$max = $length-1; 
$virtual = 0; 
$keys = array_keys($array); 
$build = array(); 
foreach($keys as $index => $key) 
{ 
    $vkey = $keys[$virtual]; 
    $build[$vkey] = $array[$vkey]; 
    $virtual += $floor + ($index % $columns < $modulo); 
    ($virtual>$max) && $virtual %= $max; 
} 

print_matrix($build, $columns); 

을 그리고 그것 뿐이다 :뿐만 아니라 키의 인덱스를 유지함으로써,이 심지어 문자열 키를 사용하여, 임의의 어레이와 함께 작동 DemoGist.

+0

전체 알파벳 (효과가 좀 더 명확하게 나타남) : http://codepad.org/OyYkexa6 –

+0

또한이 문제가 OP인지 여부는 알 수 없지만 잘립니다. 나머지 : http://codepad.org/L5QjyYJW 그냥 fyi. –

+0

그리고 기능으로 : http://codepad.org/3cNMNYmT –

1

@hakre에는 올바른 코드 응답이 있습니다. 그 이유 :

기본 정렬 기능 인 Zend_qsort는 실제로 요소와 키를 재정렬하지 않습니다. 대신 젠드 엔진이 사용하는 내부 배열 버킷을 재정렬합니다. 숫자로 인덱스 된 배열을 ksort 한 다음 $q = count($array);for($i=0; $i<$q); $i++)으로 반복하면 이전과 똑같은 값이 반환됩니다. for($key in $array)으로 반복하는 경우 새 키 주문을 받게됩니다.

+1

추가 정보를 제공해 주셔서 감사합니다. – hakre