2017-10-24 3 views
2

私は与えられたオフセットに基づいて配列の項目をシフトしたいと思います。私の現在のプロジェクトでは、これを頻繁に行う必要があるので、共通の機能を探しています。誰かが、指定されたオフセットに基づいて配列から項目をシフトする一般的な関数を提供できますか?

$data = [1, 2, 3, 4, 5, 6]; 

$data = shift($data, 2); 

dd($data); //should result into [3, 4, 5, 6, 1, 2] 

function shift($data, $offset) { 
// general code 
} 

ありがとうございます。確かに

+0

array_splice() - https://eval.in/885995 – splash58

+0

は、関連するキーですか、それとも値のみですか? –

+0

@ Don'tPanicキーが明示的に指定されていれば、それはうまくいくはずです –

答えて

1

を使用できlaravelの押し込みコレクションマクロを使用して独自のカスタム関数を作成します。

以下は負のオフセットもサポートするマクロです。

$collection = collect([1, 2, 3, 4, 5, 6]); 

$rotate = $collection->rotate(2); 

$rotate->toArray(); 

// [3, 4, 5, 6, 1, 2] 

Collection::macro('rotate', function ($offset) { 
    if ($this->isEmpty()) { 
     return new static; 
    } 
    $count = $this->count(); 
    $offset %= $count; 
    if ($offset < 0) { 
     $offset += $count; 
    } 
    return new static($this->slice($offset)->merge($this->take($offset))); 
}); 

ネイティブPHPでもコレクションを使用できますが、以下の機能はネイティブPHPでも使用できます。

function array_rotate($array, $shift) { 
    $shift %= count($array); 
    if($shift < 0) $shift += count($array); 
    return array_merge(array_slice($array, $shift, NULL, true), array_slice($array, 0, $shift, true)); 
} 

明示的に指定されている場合、どちらの関数もキーを保持します。

+0

これはかなりうまくいく。どうもありがとう。私はコアPHPでもこれを使う必要があるので、これをコアPHPにも変換しなければならないと思います。 –

+0

@amolbhatiaネイティブPHP関数の答えを更新しました – Suraj

2

単にshiftingとして、ループ

function shift($data, $offset) { 
    do { 
     $data[] = array_shift($data); 
    } while (--$offset > 0); 
    return $data; 
} 

EDIT

あなたにも負のオフセットで作業する必要がある場合は、

function shift($data, $offset) { 
    if ($offset > 0) { 
     do { 
      $data[] = array_shift($data); 
     } while (--$offset > 0); 
    } elseif ($offset < 0) { 
     do { 
      array_unshift($data, array_pop($data)); 
     } while (++$offset < 0); 
    } 
    return $data; 
} 
+0

負のオフセットでは機能しません –

+1

@amolbhatia - 元の質問で言及していない負のオフセットですか? –

+0

申し訳ありませんが、私の悪い。私はそれを言及すべきだった。まだお返事いただきありがとうございます。投票しましたが反映されません –

関連する問題