2012-02-09 5 views
3

배열 항목을 - 1 또는 + 1으로 시프트하여 해당 값으로 배열 항목을 다시 배열하거나 바꿀 때 효과적인 해결책을 찾을 수 없습니다. 사용자가 값을 위 또는 아래로 이동하여 순서를 이동하려면 배열에서 원하는 항목의 값을 위쪽이나 아래쪽으로 바꿔야합니다 (예 :배열의 항목을 해당 값으로 이동합니다.

) 이 bananapineapple를 교환해야

$desired_item_to_move = 'banana'; 

$default_order = array('orange', 'apple', 'banana', 'pineapple', 'strawberry'); 

// Typically it should return this: 

array('orange', 'banana', 'apple', 'pineapple', 'strawberry'); 

당신이 bananaapple가 교체 된 것을 볼 수 있듯이, 위쪽으로 이동 banana 때문에, 사용자가 아래로 이동하고자하는 경우 : 위쪽으로 항목 순서를 이동하고 싶어 (첫 번째 배열에서) 등등.

기능을 둘러 보았는데 이 가장 비슷하지만 배열 만 대체합니다.

답변

16

까지 쉬프트 (당신은 항목이 이미 첫 번째 아니라고 확인했습니다 가정) :

$item = $array[ $index ]; 
$array[ $index ] = $array[ $index - 1 ]; 
$array[ $index - 1 ] = $item; 

다운 쉬프트 : 이것은 모든 인스턴스를 이동합니다

$item = $array[ $index ]; 
$array[ $index ] = $array[ $index + 1 ]; 
$array[ $index + 1 ] = $item; 
0
$ret = array(); 
for ($i = 0; $i < count($array); $i++) { 
    if ($array[$i] == $desired_item_to_move && $i > 0) { 
     $tmp = array_pop($ret); 
     $ret[] = $array[$i]; 
     $ret[] = $tmp; 
    } else { 
     $ret[] = $array[$i]; 
    } 
} 

새로운 배열을 $ret에 넣고 원하는 요소를 찾습니다.

6

다른 하나 개의 위치에서 배열의 요소를 이동시키는 일반적인 문제에 대한 유용한 기능이 다음 원래 문제의 특정 문제를 해결하는 데 사용될 수

function array_move(&$a, $oldpos, $newpos) { 
    if ($oldpos==$newpos) {return;} 
    array_splice($a,max($newpos,0),0,array_splice($a,max($oldpos,0),1)); 
} 

:

// shift up 
array_move($array,$index,$index+1); 
// shift down 
array_move($array,$index,$index-1); 

참고 : 배열의 시작/끝 부분에 있는지 여부를 확인할 필요가 없습니다. 또한이 함수는 배열 키를 보존하지 않습니다. 즉, 키를 유지하면서 요소를 이동하는 것이 더 까다 롭습니다.

관련 문제