2016-04-19 9 views
0

だから私はこのような配列を持っている:配列内の開始点と終了点から1つ前の位置にあるすべてのキーをどのようにシフトできますか?

[ 
     543 => 1, 
     22 => 3, 
     65 => 4, 
     10 => 5, 
     50 => 6, 
    ] 

今私は、入力として、キーと値を取得します。たとえば、22はキー、5は値です。

ここでは、2つの入力を配列の開始点と終了点として使用し、それらの2つの位置の間ですべてのキーを前方にシフトしたいとします。

[ 
    543 => 1, 
    22 => 3, ─┐          ┌─ 65 => 3, 
    65 => 4, ├ Shift all those keys one forward to: ┤ 10 => 4, 
    10 => 5, ─┘          └─ 22 => 5, 
    50 => 6, 
] 

だから、期待される出力は次のようになります。あなたの配列にあなたの入力から開始オフセットと終了アウト

[ 
     543 => 1, 
     65 => 3, 
     10 => 4, 
     22=> 5, 
     50 => 6, 
    ] 
+0

ここのパターンがどういうものかはよくわかりません。キー「22」、「65」、「10」を「65」、「10」、「22」に変更します。パターンはどこですか?あなたはそれをやっているところでどこにいるのですか? – Rizier123

+3

@ Rizier123他のすべてのキーが上に移動するように見えますが、このためにカスタム関数を記述する必要があります。 – larsAnders

+0

@larsAnders私はあなたが意味することを知っています、 '22 => X'はちょっと始点に似ていて、終点は' X => 5'で、すべてのキーを前にシフトしたいのですが、これはOPが意味するものです。 – Rizier123

答えて

2

図:

$startIndex = array_search(22, array_keys($arr)); 
$endIndex = array_search(5 , array_values($arr)); 
         //↑ Your input 

だからあなたの例の配列のために、これが見えますこのように:

[ 
    543 => 1, //Offset: 0 
    22 => 3, //Offset: 1 ← 22 found; offset: 1 
    65 => 4, //Offset: 2 
    10 => 5, //Offset: 3 ← 5 found; offset: 3 
    50 => 6, //Offset: 4 
] 
[ 
    543 => 1, → $before; Where you do NOT want to shift your keys 
    22 => 3, ┐ 
    65 => 4, ├ $data; Where you want to shift your leys 
    10 => 5, ┘ 
    50 => 6, → $after; Where you do NOT want to shift your keys 
] 

だけで他のキーとスタートで最後のキーをマージして、データパート・キーを回して:これは次のようになります可視化

$before = array_slice($arr, 0, $startIndex, true); 
$data = array_slice($arr, $startIndex, ($endIndex - $startIndex) + 1, true); 
$after = array_slice($arr, $endIndex, null, true); 

:は、3つの部分にあなたの配列を分割しました終了:

$keys = array_keys($data); 
$keys = array_merge(array_slice($keys, -1), array_slice($keys, 0, -1)); 
$data = array_combine($keys, $data); 

は戻って一緒にそれをすべて入れ:

$arr = $before + $data + $after; 
+0

返信いただきありがとうございますが、コードを実装した後に出力を印刷する場合、配列の結果は最初に定義されたものと同じです。だから私が間違っているところを教えてください。 – user2110253

+0

@Rizier電話会議で気を散らしてしまいました。 – deceze

+0

問題ありません。 (@ user2110253答えはあなたのために今働くはずです、もう一度それをチェックしてください) – Rizier123