24

PHPで配列を簡単に「回転」させることは可能ですか?

このように:1、2、3、4-> 2、3、4、1

このための組み込みのPHP関数のようなものはありますか?

4

13 に答える 13

31
  $numbers = array(1,2,3,4);
  array_push($numbers, array_shift($numbers));
  print_r($numbers);

出力

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
    [3] => 1
)
于 2011-04-08T23:20:46.660 に答える
28

現在の回答のほとんどは正しいですが、インデックスを気にしない場合に限ります。

$arr = array('foo' => 'bar', 'baz' => 'qux', 'wibble' => 'wobble');
array_push($arr, array_shift($arr));
print_r($arr);

出力:

Array
(
    [baz] => qux
    [wibble] => wobble
    [0] => bar
)

インデックスを保持するには、次のようにします。

$arr = array('foo' => 'bar', 'baz' => 'qux', 'wibble' => 'wobble');

$keys = array_keys($arr);
$val = $arr[$keys[0]];
unset($arr[$keys[0]]);
$arr[$keys[0]] = $val;

print_r($arr);

出力:

Array
(
    [baz] => qux
    [wibble] => wobble
    [foo] => bar
)

おそらく誰かが私の4行の方法よりも簡潔に回転を行うことができますが、これはとにかく機能します。

于 2011-10-26T22:45:40.090 に答える
6

それは非常に単純で、多くの方法で行うことができます。例:

$array   = array( 'a', 'b', 'c' );
$array[] = array_shift( $array );
于 2011-04-08T23:25:07.740 に答える
3

キーを維持して回転させる方法。array_push(array、array_shift(array))と同じ概念を使用して、代わりに2つのarray_slicesのarray_mergeを使用します

$x = array("a" => 1, "b" => 2, "c" => 3, 'd' => 4);

最初の要素を最後に移動するには

array_merge(array_slice($x, 1, NULL, true), array_slice($x, 0, 1, true) //'b'=>2, 'c'=>3, 'd'=>4, 'a'=>1

最後の要素を前に移動するには

array_merge(array_slice($x, count($x) -1, 1, true), array_slice($x, 0, //'d'=>4, 'a'=>1, 'b'=>2, 'c'=>3

于 2014-09-10T20:50:10.553 に答える
3

配列をループすること、およびshift-ingとpush-ingは、配列を回転させる一般的な方法ですが、多くの場合、キーを台無しにする可能性があります。より堅牢な方法は、との組み合わせを使用することarray_mergeですarray_splice

/**
 * Rotates an array.
 * 
 * Numerical indexes will be renumbered automatically.
 * Associations will be kept for keys which are strings.
 * 
 * Rotations will always occur similar to shift and push,
 * where the number of items denoted by the distance are
 * removed from the start of the array and are appended.
 * 
 * Negative distances work in reverse, and are similar to
 * pop and unshift instead.
 * 
 * Distance magnitudes greater than the length of the array
 * can be interpreted as rotating an array more than a full
 * rotation. This will be reduced to calculate the remaining
 * rotation after all full rotations.
 * 
 * @param array $array The original array to rotate.
 * Passing a reference may cause the original array to be truncated.
 * @param int $distance The number of elements to move to the end.
 * Distance is automatically interpreted as an integer.
 * @return array The modified array.
 */
function array_rotate($array, $distance = 1) {
    settype($array, 'array');
    $distance %= count($array);
    return array_merge(
        array_splice($array, $distance), // Last elements  - moved to the start
        $array                          //  First elements - appended to the end
    );
}
// Example rotating an array 180°.
$rotated_180 = array_rotate($array, count($array) / 2);

array_keysまたは、キーを回転させて異なる値と一致させる必要がある場合は、、、、、およびarray_combineを組み合わせることarray_rotateができますarray_values

/**
 * Rotates the keys of an array while keeping values in the same order.
 * 
 * @see array_rotate(); for function arguments and output.
 */
function array_rotate_key($array, $distance = 1) {
    $keys = array_keys((array)$array);
    return array_combine(
        array_rotate($keys, $distance), // Rotated keys
        array_values((array)$array)    //  Values
    );
}

または、キーを同じ順序に保ちながら値をローテーションします(一致するarray_rotate_key関数呼び出しで負の距離を呼び出すのと同じです)。

/**
 * Rotates the values of an array while keeping keys in the same order.
 * 
 * @see array_rotate(); for function arguments and output.
 */
function array_rotate_value($array, $distance = 1) {
    $values = array_values((array)$array);
    return array_combine(
        array_keys((array)$array),        // Keys
        array_rotate($values, $distance) //  Rotated values
    );
}

そして最後に、数値インデックスの番号の付け直しを防ぎたい場合。

/**
 * Rotates an array while keeping all key and value association.
 * 
 * @see array_rotate(); for function arguments and output.
 */
function array_rotate_assoc($array, $distance = 1) {
    $keys = array_keys((array)$array);
    $values = array_values((array)$array);
    return array_combine(
        array_rotate($keys, $distance),   // Rotated keys
        array_rotate($values, $distance) //  Rotated values
    );
}

いくつかのベンチマークテストを実行することは有益かもしれませんが、どの方法を使用しても、リクエストごとにほんの一握りのローテーションがパフォーマンスに目立った影響を与えることはないと思います。

カスタムの並べ替え関数を使用して配列を回転することも可能ですが、非常に複雑になる可能性があります。すなわちusort

于 2018-02-27T03:19:59.540 に答える
2

この関数を使用できます:

    function arr_rotate(&$array,$rotate_count) {
        for ($i = 0; $i < $rotate_count; $i++) {
            array_push($array, array_shift($array));
        }
    }

利用方法:

    $xarr = array('1','2','3','4','5');
    arr_rotate($xarr, 2);
    print_r($xarr);

結果:

 Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 1 [4] => 2 )
于 2016-12-10T07:37:30.320 に答える
2

Hackerrankの配列ローテーションに関するタスクがあります:https ://www.hackerrank.com/challenges/array-left-rotation/problem 。

そして、提案されたソリューションはarray_pusharray_shiftタイムアウトのために失敗する最後のテストケースを除くすべてのテストケースで機能します。だから、array_pushそしてarray_shiftあなたに最速の解決策を与えることはありません。

より高速なアプローチは次のとおりです。

function leftRotation(array $array, $n) {
   for ($i = 0; $i < $n; $i++) {
       $value = array[$i]; unset(array[$i]); array[] = $value;
   }
   return array;
}
于 2018-01-19T17:51:15.727 に答える
1

とを使用array_shiftarray_pushます。

于 2011-04-08T23:21:33.583 に答える
1
$daynamesArray = array("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");
array_push($daynamesArray, array_shift($daynamesArray)); //shift by one
array_push($daynamesArray, array_shift($daynamesArray)); //shift by two
print_r($daynamesArray);

出力は「水曜日」から始まります。

Array ( [0] => Wednesday [1] => Thursday [2] => Friday [3] => Saturday [4] => Sunday [5] => Monday [6] => Tuesday 
于 2015-04-19T03:05:41.773 に答える
1

はい、そうです。これが私が自分で行った関数です。ここで、$ Aは配列で、$Kは配列を回転させたい回数です。

function solution($A, $K) {

  for($i = 0; $i < $K; $i++): //we cycle $K
    $arrayTemp = $A;
    for($j = 0; $j < count($arrayTemp); $j++): // we cycle the array
       if($j == count($arrayTemp) - 1) $A[0] = $arrayTemp[$j]; // we check for the last position
       else $A[$j + 1] = $arrayTemp[$j]; // all but last position
    endfor;
  endfor;
 return $A;

}
于 2019-05-07T09:00:19.113 に答える
0

論理は要素を交換することです。アルゴリズムは次のようになります-

 for i = 0 to arrayLength - 1
    swap( array[i], array[i+1] )     // Now array[i] has array[i+1] value and 
                                     // array[i+1] has array[i] value.
于 2011-04-08T23:23:36.273 に答える
0

いいえarray_shift。作成に使用できるいくつかのツールについては、ドキュメントとそれに関連する機能を確認してください。array_rotateそのページのコメントに実装されている関数があるかもしれません。

PHPで使用できる配列関数を完全に理解するには、左側のサイドバーにリストされている配列関数を読むことも価値があります。

于 2011-04-08T23:24:55.427 に答える
0

配列(ゼロインデックス配列)を任意の位置に回転させる関数は次のとおりです。

function rotateArray($inputArray, $rotateIndex) {
  if(isset($inputArray[$rotateIndex])) {
    $startSlice = array_slice($inputArray, 0, $rotateIndex);
    $endSlice = array_slice($inputArray, $rotateIndex);
    return array_merge($endSlice, $startSlice);
  }
  return $inputArray;
}

$testArray = [1,2,3,4,5,6];
$testRotates = [3, 5, 0, 101, -5];

foreach($testRotates as $rotateIndex) {
  print_r(rotateArray($testArray, $rotateIndex));
}
于 2020-06-24T19:07:43.317 に答える