2010-03-01 3 views
39

Avoir un cerveau geler sur un problème assez trivial. Si je commence par un tableau comme celui-ci:Comment déplacer un élément de tableau avec une clé connue à la fin d'un tableau en PHP?

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

... et de nouveaux éléments peuvent être ajoutés avec différentes clés mais toujours une valeur tableau. Maintenant, je peux être sûr que le premier élément aura toujours la clé 'singe' mais je ne peux pas être sûr de l'une des autres touches.

Lorsque j'ai fini de remplir le tableau, je veux déplacer l'élément connu 'singe' à la fin du tableau sans perturber l'ordre des autres éléments. Quel est le moyen le plus efficace de le faire? Chaque fois que je peux penser à quelque chose semble un peu maladroit et je sens que je manque quelque chose d'évident.

Répondre

67

La seule façon que je peux penser à faire est de le retirer puis ajouter:

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

Oui, c'est probablement le meilleur moyen. Je pense probablement trop à ce sujet. – tamewhale

+0

Cela ne fonctionne plus en PHP 7.1, il semble –

+0

@RolandSeuhs quoi exactement ne fonctionne pas en PHP 7.1? cela semble fonctionner correctement pour moi. – JonnieJS

7

array_shift est probablement moins efficace que unsetting the index, mais cela fonctionne:

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

Une autre alternative est avec un rappel et uksort:

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

Vous devez utiliser un lambda correct si vous utilisez PHP5.3 + ou simplement définir la fonction comme une fonction globale régulièrement.

+0

Les deux bonnes réponses. Le genre était quelque chose que j'avais en tête, mais cela semblait être exagéré. – tamewhale

+2

@tamewhale Merci. J'ai fait un benchmark très superficiel avec 24 animaux et "unset" est vraiment le plus rapide. Il est 10 fois plus rapide que 'array_shift' et 300 fois plus rapide que' uksort'. – Gordon

+0

Aimez le one liner - peut-être pas le plus efficace mais dans la plupart des cas cela ne comptera jamais et l'élégance de l'approche 'array_shift()' le rend propre et lisible. – billynoah

1

Vous pouvez implémenter un calcul de base et obtenir une fonction universelle pour déplacer un élément de tableau d'une position à l'autre.

Pour PHP, il ressemble à ceci:

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

Check out "déplacer les éléments du tableau" à "gloommatter" pour une explication détaillée.

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

1

Je aime vraiment @ la réponse de Gordon ci-dessus pour son élégance comme une doublure, mais il ne fonctionne que si la clé est au début. Voici une autre doublure qui fonctionnera pour une clé dans n'importe quelle position:

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