이 설정 다음
각 멤버를 출력하고 인덱스 (행과 콜 럼)에 의해 열쇠뿐만 아니라 요소 주문
$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);
을 그리고 그것 뿐이다 :뿐만 아니라 키의 인덱스를 유지함으로써,이 심지어 문자열 키를 사용하여, 임의의 어레이와 함께 작동 Demo을 Gist.
데이터는 사전 정렬 방식으로 어떻게 저장됩니까? –
질문에 코드 시도를 포함해야합니다 (대부분의 경우). –
이 데이터는 여기에 표시된 것처럼 배열의 배열입니까? 왜냐하면 당신은 단지 그것을 반복하고 교환하기 때문입니다. – Incognito