2012-02-09 23 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のため、ユーザーはそれを下に移動させたい場合は:上向きの項目の順序を移動したいです(最初の配列から)などです。

私は関数を調べましたが、array_replaceは最も近いですが、配列を置き換えるだけです。

答えて

16

(アイテムがまだ最初の1でないことをチェックしましたと仮定した場合)シフトアップ:

$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); 

アレイの開始点/終了点にあるかどうかを確認する必要はありません。また、この関数は配列キーを保持しないことに注意してください。キーを保持しながら要素を動かすのはもっと面倒です。

関連する問題