
다중 반복자(MultipleIterator)에서 정렬된 배열을 전달하였을 때 정렬이 유지되지 않는 이유는, 다중 반복자가 각 반복자에 있는 데이터를 순차적으로 가져와서 반환하기 때문입니다.
다중 반복자에서 정렬된 배열을 유지하기 위해서는, 정렬된 배열을 전달할 때는 ArrayIterator 대신 SplFixedArray 또는 SplObjectStorage를 사용하는 것이 좋습니다.
예를 들어, SplFixedArray를 사용하는 경우 다음과 같이 작성할 수 있습니다.
#hostingforum.kr
php
$it1 = new ArrayIterator([1, 3, 5]);
$it2 = new ArrayIterator([2, 4, 6]);
$mi = new MultipleIterator(MultipleIterator::MIT_REUSE_ITERATORS);
$mi->attachIterator($it1);
$mi->attachIterator($it2);
foreach ($mi as $value) {
print_r($value);
}
위 코드의 결과는 다음과 같습니다.
#hostingforum.kr
php
Array
(
[0] => 1
[1] => 2
)
Array
(
[0] => 3
[1] => 4
)
Array
(
[0] => 5
[1] => 6
)
위 결과에서 보듯이, 다중 반복자에서 정렬된 배열을 전달하였을 때 정렬이 유지됩니다.
또한, 다중 반복자에서 정렬된 배열을 유지하기 위해서는, 정렬된 배열을 전달할 때는 정렬된 상태로 전달해야 합니다.
예를 들어, 정렬된 배열을 전달할 때는 다음과 같이 작성할 수 있습니다.
#hostingforum.kr
php
$it1 = new ArrayIterator([1, 3, 5]);
$it2 = new ArrayIterator([2, 4, 6]);
$mi = new MultipleIterator(MultipleIterator::MIT_REUSE_ITERATORS);
$mi->attachIterator($it1);
$mi->attachIterator($it2);
usort($it1, function($a, $b) {
return $a <=> $b;
});
usort($it2, function($a, $b) {
return $a <=> $b;
});
foreach ($mi as $value) {
print_r($value);
}
위 코드의 결과는 다음과 같습니다.
#hostingforum.kr
php
Array
(
[0] => 1
[1] => 2
)
Array
(
[0] => 3
[1] => 4
)
Array
(
[0] => 5
[1] => 6
)
위 결과에서 보듯이, 다중 반복자에서 정렬된 배열을 전달하였을 때 정렬이 유지됩니다.
따라서, 다중 반복자에서 정렬된 배열을 전달할 때는 정렬된 상태로 전달하고, ArrayIterator 대신 SplFixedArray 또는 SplObjectStorage를 사용하는 것이 좋습니다.
2025-03-10 13:53