Array-Elemente nach links drehen (erstes Element zum letzten verschieben und neu indizieren)

Lesezeit: 6 Minuten

Benutzer-Avatar
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?

  • 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

  $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

Benutzer-Avatar
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

Benutzer-Avatar
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_rotateund 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.

Benutzer-Avatar
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 )

Benutzer-Avatar
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;
}

1019330cookie-checkArray-Elemente nach links drehen (erstes Element zum letzten verschieben und neu indizieren)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy