PHP 배열의 모든 순열 생성
문제:
문자열 배열이 제공됨 , 해당 요소의 가능한 모든 순열을 생성합니다. 예를 들어, ['peter', 'paul', 'mary'] 배열의 경우 다음을 수행해야 합니다. 획득:
- peter-paul-mary
- peter-mary-paul
- paul-peter-mary
- paul-mary-peter
- mary-peter-paul
- mary-paul-peter
솔루션 1: pc_permute 함수
이 함수는 재귀를 사용하여 배열 내의 요소를 교체하고 순서를 변경하여 순열을 생성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | function pc_permute( $items , $perms = array ()) {
if ( empty ( $items )) {
echo join( ' ' , $perms ) . "<br />" ;
} else {
for ( $i = count ( $items ) - 1; $i >= 0; -- $i ) {
$newitems = $items ;
$newperms = $perms ;
list( $foo ) = array_splice ( $newitems , $i , 1);
array_unshift ( $newperms , $foo );
pc_permute( $newitems , $newperms );
}
}
}
|
로그인 후 복사
해결책 2: pc_next_permutation 함수
다른 접근 방식은 다음 순열을 활용하는 것입니다. 알고리즘.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function pc_next_permutation( $p , $size ) {
for ( $i = $size - 1; $p [ $i ] >= $p [ $i +1]; -- $i ) { }
if ( $i == -1) { return false; }
for ( $j = $size ; $p [ $j ] <= $p [ $i ]; -- $j ) { }
$tmp = $p [ $i ]; $p [ $i ] = $p [ $j ]; $p [ $j ] = $tmp ;
for (++ $i , $j = $size ; $i < $j ; ++ $i , -- $j ) {
$tmp = $p [ $i ]; $p [ $i ] = $p [ $j ]; $p [ $j ] = $tmp ;
}
return $p ;
}
|
로그인 후 복사
사용:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $arr = array ( 'peter' , 'paul' , 'mary' );
pc_permute( $arr );
or
$set = split( ' ' , 'she sells seashells' );
$size = count ( $set ) - 1;
$perm = range(0, $size );
$j = 0;
do {
foreach ( $perm as $i ) { $perms [ $j ][] = $set [ $i ]; }
} while ( $perm = pc_next_permutation( $perm , $size ) and ++ $j );
foreach ( $perms as $p ) {
print join( ' ' , $p ) . "\n" ;
}
|
로그인 후 복사
참고:
- http://docstore.mik.ua/orelly/webprog/pcook/ch04_26.htm
위 내용은 PHP 배열의 모든 순열을 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!