web-dev-qa-db-fra.com

Comment déplacer un élément de tableau avec une clé connue à la fin d'un tableau en PHP?

Avoir un cerveau gelé sur un problème assez trivial. Si je commence avec un tableau comme celui-ci:

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

... et de nouveaux éléments peuvent être ajoutés avec des clés différentes mais toujours une valeur de 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 clés.

Lorsque j'ai fini de remplir le tableau, je souhaite déplacer l'élément connu 'monkey' vers la fin du tableau sans perturber l'ordre des autres éléments. Quel est le moyen le plus efficace de le faire?

Chaque façon dont je peux penser semble un peu maladroite et je sens que je manque quelque chose d’évident.

45
tamewhale

La seule façon pour moi de faire cela est de l'enlever puis de l'ajouter:

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

array_shift est probablement moins efficace que désélectionne l'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 voudrez utiliser un lambda approprié si vous utilisez PHP 5.3 + ou simplement définir la fonction comme une fonction globale régulièrement.

8
Gordon

J'aime beaucoup la réponse de @ Gordon ci-dessus pour son élégance en une ligne, mais cela ne fonctionne que si la clé est au début. Voici un autre support 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);

EDIT: Attention, cela ne fonctionne pas avec les touches numériques.

3
billynoah

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

Pour PHP, cela 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; 
}

Consultez «éléments de tableau en mouvement» sur «gloommatter» pour une explication détaillée.

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

1
Andrea

Contribuer à la réponse acceptée - pour que l'élément ne soit pas inséré dans la même position, mais placé à la fin du tableau:

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

au lieu de:

$my_array['monkey'] = $v;

utilisation:

array_Push($my_array, $v);
0