是否可以在PHP中轻松“旋转”数组?
像这样: 1,2,3,4 - > 2,3,4,1
是否有某种内置的PHP函数?
答案 0 :(得分:22)
$numbers = array(1,2,3,4);
array_push($numbers, array_shift($numbers));
print_r($numbers);
输出
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 1
)
答案 1 :(得分:21)
目前大多数答案都是正确的,但前提是你不关心你的指数:
$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
)
也许有人可以比我的四线方法更简洁地进行轮换,但无论如何这都适用。
答案 2 :(得分:6)
这很简单,可以通过多种方式完成。例如:
$array = array( 'a', 'b', 'c' );
$array[] = array_shift( $array );
答案 3 :(得分:1)
答案 4 :(得分:1)
维护键和旋转的方法。使用与array_push(array,array_shift(array))相同的概念,而不是使用array_merge of 2 array_slices
$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
答案 5 :(得分:1)
你可以使用这个功能:
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 )
答案 6 :(得分: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.
答案 7 :(得分:0)
没有。查看array_shift
及其相关功能的文档,了解可编写的一些工具。甚至可能在该页面的评论中实现了array_rotate
功能。
还值得阅读左侧边栏上列出的数组函数,以全面了解PHP中可用的数组函数。
答案 8 :(得分:0)
$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);
输出从&#34;星期三&#34;开始:
Array ( [0] => Wednesday [1] => Thursday [2] => Friday [3] => Saturday [4] => Sunday [5] => Monday [6] => Tuesday
答案 9 :(得分:0)
关于Hackerrank上的数组轮换的任务:https://www.hackerrank.com/challenges/array-left-rotation/problem。
使用array_push
和array_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;
}
答案 10 :(得分:0)
循环遍历数组,以及shift
- 和push
- 可能是旋转数组的常用方法,但它常常会弄乱你的键。更健壮的方法是使用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
。
答案 11 :(得分:0)
是的,这是我自己做的一个函数,其中$ 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;
}
答案 12 :(得分: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));
}
答案 13 :(得分:-2)
请使用内置功能array_reverse
。这是“旋转”的最快方式。 php中的数组。