2009-11-21 3 views

답변

1

array_slice을 사용하여 셔플하려는 배열 부분을 복사하고 복사본을 섞은 다음 array_splice을 사용하여 셔플 된 데이터를 원래 배열로 다시 복사 할 수 있습니다.

편집 : 더 일반적으로 셔플하려는 항목의 키를 알고있는 경우 $keys이라는 배열에 넣으십시오. 그런 다음 :

// Get out the items to shuffle. 
$work = array(); 
foreach ($keys as $i => $key) { 
    $work[$i] = $myarray[$key]; 
} 

shuffle($work); // shuffle them 

// And put them back. 
foreach ($keys as $i => $key) { 
    $myarray[$key] = $work[$i]; 
} 

(죄송합니다,이 몇 가지 실수가있는 경우, 내 PHP는 녹슨이고 나는 그것을 테스트 할 수있는 컴퓨터 근처에 아니에요!) 다차원 위해 작동과 매우 유사

뭔가 정렬. $keys의 각 요소는 인덱스 배열 일 수 있으며 $myarray[$key] 대신 $myarray[$key[0]][$key[1]]을 작성합니다.

+0

배열이 다차원 배열이고 첫 번째 레벨이 아닌 두 번째 레벨의 일부 요소를 임의로 혼합하길 원한다면 어떻게해야합니까? – Steven

+0

OK, 다차원 배열에이 기술을 적용하는 방법을 설명하기 위해 편집했습니다. –

2

function swap(&$a, &$b) { list($a, $b) = array($b, $a); } 

$len = count($a); 
for($i = 0; $i < $len; $i++) { 
    $j = rand(1, $len) - 1; 
    swap($a[$i], $a[$j]); 
} 

이러한 모든 배열 요소를 셔플 표준 루프 다음 ​​고려한다. 일부 ("이동") 요소를 섞으려면의이이 위치에 요소를 이동

$len = count($keys); 
for($i = 0; $i < $len; $i++) { 
    $j = rand(1, $len) - 1; 
    swap($a[$keys[$i]], $a[$keys[$j]]); 
} 

키 $를 통해 루프 $ 이상 루프를 배열

$keys = array(1, 3, 5, 7, 9, 11, 13, 17); 

에 열쇠를 넣어 불러들이는 대신, 1, 3, 5 등 다른 요소를 제자리에 남겨 놓습니다.

+0

수치 배열이 아닌 연관 배열을 셔플하고 싶습니다. – Steven

+0

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm에 따르면, rand (1, $ len)보다는 rand ($ i, $ len)에서 바꿀 수 있습니다. –

관련 문제