Ist es möglich, ein Array in PHP einfach zu “rotieren”?
So: 1, 2, 3, 4 -> 2, 3 ,4 ,1
Gibt es dafür eine Art eingebaute PHP-Funktion?
Dylan
Ist es möglich, ein Array in PHP einfach zu “rotieren”?
So: 1, 2, 3, 4 -> 2, 3 ,4 ,1
Gibt es dafür eine Art eingebaute PHP-Funktion?
$numbers = array(1,2,3,4);
array_push($numbers, array_shift($numbers));
print_r($numbers);
Ausgabe
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 1
)
Dies ist in Ordnung, wenn Sie Ihr Array nur wie einen Vektor verwenden und die Indexwerte nicht wichtig sind. Aber wenn Sie ein assoziatives Array haben, das Sie drehen möchten, zerstört diese Methode Ihre Array-Schlüssel. Siehe meine Antwort für einen Weg, der sie bewahrt.
– Cam Jackson
26. Oktober 2011 um 22:47 Uhr
@Cam, da hast du absolut Recht, selbst OP hat keinen Array-Index erwähnt, nur Werte. Ihre Antwort ist wertvoll für Leute, die nach einer Lösung suchen, um beide Teile von Array-Elementen zu drehen. (+1 für deine Antwort)
– Wh1T3h4Ck5
29. Oktober 2011 um 6:46 Uhr
ja klar hat deine Methode für die OP ausgereicht, sonst hätte er sie nicht akzeptiert! Aber ja, ich dachte, ich würde meine Antwort hinzufügen, falls jemand das gleiche Problem hatte wie ich 🙂
– Cam Jackson
30. Oktober 2011 um 7:44 Uhr
das habe ich gesucht!
– Peter Perhač
8. Oktober 2013 um 16:19 Uhr
nach rechts drehen: array_unshift($numbers,array_pop($numbers));
– Titus
26. September 2018 um 11:56 Uhr
Cam Jackson
Die meisten der aktuellen Antworten sind richtig, aber nur, wenn Sie sich nicht um Ihre Indizes kümmern:
$arr = array('foo' => 'bar', 'baz' => 'qux', 'wibble' => 'wobble');
array_push($arr, array_shift($arr));
print_r($arr);
Ausgabe:
Array
(
[baz] => qux
[wibble] => wobble
[0] => bar
)
Um Ihre Indizes zu erhalten, können Sie Folgendes tun:
$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);
Ausgabe:
Array
(
[baz] => qux
[wibble] => wobble
[foo] => bar
)
Vielleicht kann jemand die Drehung prägnanter machen als meine Vier-Linien-Methode, aber das funktioniert trotzdem.
gegolft: list($k,$v)=each($arr);unset($arr[$k]);$arr[$k]=$v;
. Möglicherweise müssen Sie voranstellen reset($arr);
.
– Titus
26. September 2018 um 11:54 Uhr
Es ist sehr einfach und kann auf viele Arten durchgeführt werden. Beispiel:
$array = array( 'a', 'b', 'c' );
$array[] = array_shift( $array );
Eine Methode zum Beibehalten von Schlüsseln und Rotieren. Wir verwenden das gleiche Konzept wie array_push(array, array_shift(array)), stattdessen verwenden wir array_merge von 2 array_slices
$x = array("a" => 1, "b" => 2, "c" => 3, 'd' => 4);
Um das erste Element an das Ende zu verschieben
array_merge(array_slice($x, 1, NULL, true), array_slice($x, 0, 1, true)
//'b'=>2, 'c'=>3, 'd'=>4, 'a'=>1
Um das letzte Element nach vorne zu verschieben
array_merge(array_slice($x, count($x) -1, 1, true), array_slice($x, 0,
//'d'=>4, 'a'=>1, 'b'=>2, 'c'=>3
Shaun Cockerill
Schleife durch das Array und shift
-ing und push
-ing, kann ein üblicher Weg sein, ein Array zu drehen, aber es kann oft Ihre Schlüssel durcheinander bringen. Eine robustere Methode ist die Verwendung einer Kombination aus array_merge
und 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);
Alternativ können Sie kombinieren, wenn Sie Schlüssel auch rotieren müssen, damit sie mit unterschiedlichen Werten übereinstimmen array_keys
, array_combine
, array_rotate
und 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
);
}
Oder rotieren Sie alternativ die Werte, während Sie die Schlüssel in derselben Reihenfolge halten (entspricht dem Aufrufen der negativen Distanz beim Matching array_rotate_key
Funktionsaufruf).
/**
* 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
);
}
Und schließlich, wenn Sie die Neunummerierung von numerischen Indizes verhindern möchten.
/**
* 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
);
}
Es könnte von Vorteil sein, einige Benchmark-Tests durchzuführen, aber ich gehe davon aus, dass eine kleine Handvoll Rotationen pro Anfrage die Leistung nicht merklich beeinträchtigen würde, unabhängig davon, welche Methode verwendet wird.
Es sollte auch möglich sein, ein Array mithilfe einer benutzerdefinierten Sortierfunktion zu drehen, aber es wäre höchstwahrscheinlich zu kompliziert. dh usort
.
A1Gard
Sie können diese Funktion verwenden:
function arr_rotate(&$array,$rotate_count) {
for ($i = 0; $i < $rotate_count; $i++) {
array_push($array, array_shift($array));
}
}
Verwendungszweck:
$xarr = array('1','2','3','4','5');
arr_rotate($xarr, 2);
print_r($xarr);
Ergebnis:
Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 1 [4] => 2 )
Gino Pane
Es gibt eine Aufgabe zur Array-Rotation auf Hackerrank: https://www.hackerrank.com/challenges/array-left-rotation/problem.
Und Lösungsvorschlag mit array_push
und array_shift
funktioniert für alle Testfälle außer dem letzten, der aufgrund einer Zeitüberschreitung fehlschlägt. So, array_push
und array_shift
wird Ihnen nicht die schnellste Lösung geben.
Hier ist der schnellere Ansatz:
function leftRotation(array $array, $n) {
for ($i = 0; $i < $n; $i++) {
$value = array[$i]; unset(array[$i]); array[] = $value;
}
return array;
}
Hier ist ein Hinweis: Alles, was Sie tun müssen, ist das erste Element (“pop”) zu entfernen und es als letztes Element (“push”) wieder hinzuzufügen.
– Mattball
8. April 2011 um 23:20 Uhr