wake-up-neo.net

Wie verschiebe ich ein Array-Element mit einem bekannten Schlüssel an das Ende eines Arrays in PHP?

Ein Gehirn eingefroren über ein ziemlich triviales Problem. Wenn ich mit einem Array wie diesem beginne:

$my_array = array(
                  'monkey'  => array(...),
                  'giraffe' => array(...),
                  'lion'    => array(...)
);

... und neue Elemente werden möglicherweise mit anderen Schlüsseln hinzugefügt, aber immer mit einem Array-Wert. Jetzt kann ich sicher sein, dass das erste Element immer den Schlüssel "Affe" haben wird, aber ich kann mich bei den anderen Schlüsseln nicht sicher sein.

Wenn ich das Array ausgefüllt habe, möchte ich das bekannte Element 'Affe' an das Ende des Arrays verschieben, ohne die Reihenfolge der anderen Elemente zu stören. Was ist der effizienteste Weg, dies zu tun?

Jede Art und Weise, die mir einfällt, wirkt etwas klobig und ich habe das Gefühl, dass mir etwas offensichtliches fehlt.

45
tamewhale

Die einzige Möglichkeit, dies zu tun, ist, sie zu entfernen und dann hinzuzufügen:

$v = $my_array['monkey'];
unset($my_array['monkey']);
$my_array['monkey'] = $v;
83
cletus

array_shift ist wahrscheinlich weniger effizient als den Index nicht setzen , aber es funktioniert:

$my_array = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$my_array['monkey'] = array_shift($my_array);
print_r($my_array);

Eine andere Alternative ist mit einem Rückruf und uksort :

uksort($my_array, create_function('$x,$y','return ($y === "monkey") ? -1 : 1;'));

Wenn Sie PHP5.3 + verwenden, sollten Sie ein richtiges lambda verwenden oder die Funktion regelmäßig als globale Funktion definieren.

8
Gordon

@ Gordons Antwort gefällt mir sehr, weil er als One-Liner elegant ist, aber er funktioniert nur, wenn der Schlüssel am Anfang steht. Hier ist ein weiterer Liner, der in jeder Position für einen Schlüssel funktioniert:

$arr = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$arr += array_splice($arr,array_search('giraffe',array_keys($arr)),1);

EDIT: Achtung, dies schlägt mit den numerischen Tasten fehl.

3
billynoah

Sie können einige grundlegende Berechnungen implementieren und eine universelle Funktion zum Verschieben von Array-Elementen von einer Position zur anderen erhalten.

Für PHP sieht es so aus:

function magicFunction ($targetArray, $indexFrom, $indexTo) { 
    $targetElement = $targetArray[$indexFrom]; 
    $magicIncrement = ($indexTo - $indexFrom) / abs ($indexTo - $indexFrom); 

    for ($Element = $indexFrom; $Element != $indexTo; $Element += $magicIncrement){ 
        $targetArray[$Element] = $targetArray[$Element + $magicIncrement]; 
    } 

    $targetArray[$indexTo] = $targetElement; 
}

Schauen Sie sich "Bewegliche Array-Elemente" unter "Gloommatter" an, um eine detaillierte Erklärung zu erhalten.

http://www.gloommatter.com/DDesign/programming/moving-any-array-elements-universal-function.html

1
Andrea

Beitrag zur akzeptierten Antwort - damit das Element nicht an derselben Position eingefügt wird, sondern am Ende des Arrays platziert wird:

$v = $my_array['monkey'];
unset($my_array['monkey']);

anstatt:

$my_array['monkey'] = $v;

benutzen:

array_Push($my_array, $v);