PHP: "вращать" массив?
Можно ли легко "повернуть" массив в PHP?
Вот так:
1, 2, 3, 4 → 2, 3, 4, 1
Есть ли какая-то встроенная функция PHP для этого?
Ответы
Ответ 1
Большинство текущих ответов верны, но только если вам не нужны ваши индексы:
$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
$numbers = array(1,2,3,4);
array_push($numbers, array_shift($numbers));
print_r($numbers);
Выход
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 1
)
Ответ 3
Это очень просто и может быть сделано разными способами. Пример:
$array = array( 'a', 'b', 'c' );
$array[] = array_shift( $array );
Ответ 4
Используйте array_shift
и array_push
Ответ 5
Используйте array_shift
и array_push
.
Ответ 6
Способ сохранения ключей и поворота. используя ту же концепцию, что и array_push (array, array_shift (array)), вместо этого мы будем использовать array_merge из 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
Ответ 7
вы можете использовать эту функцию:
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 )
Ответ 8
Логика заключается в замене элементов. Алгоритм может выглядеть так:
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.
Ответ 9
Нет. Проверьте документацию array_shift
и связанные с ней функции для некоторых инструментов, которые вы можете использовать для написания. В комментариях к этой странице может быть даже функция array_rotate
.
Также стоит прочитать функции массива, перечисленные на левой боковой панели, чтобы получить полное представление о том, какие функции массива доступны в PHP.
Ответ 10
$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
Ответ 11
Там есть задача о вращении массива на 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;
}
Ответ 12
Циклическое shift
по массиву, 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
функции 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
.
Ответ 13
Да, это функция, которую я сделал сам, где $ 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;
}
Ответ 14
Пожалуйста, используйте функцию сборки array_reverse
. Это самый быстрый способ "повернуть" массив в php.
http://php.net/manual/de/function.array-reverse.php