PHP: déplacer l'élément du tableau associatif au début du tableau

94

Quelle serait la meilleure méthode pour déplacer n'importe quel élément d'un tableau associatif au début du tableau?

Par exemple, disons que j'ai le tableau suivant:

$myArray = array(
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one'   => 'Blah Blah Blah 1',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

Ce que je veux faire, c'est déplacer l'élément `` un '' au début et finir avec le tableau suivant:

$myArray = array(
    'one'   => 'Blah Blah Blah 1',
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

la source

Réponses:

182

Vous pouvez utiliser l'opérateur d'union de tableau ( +) pour joindre le tableau d'origine à un nouveau tableau associatif à l'aide de la clé connue ( one).

$myArray = array('one' => $myArray['one']) + $myArray;
// or      ['one' => $myArray['one']] + $myArray;

Les clés de tableau sont uniques, il serait donc impossible qu'elles existent à deux emplacements.

Voir plus loin dans le document sur les opérateurs de tableaux:

L'opérateur + renvoie le tableau de droite ajouté au tableau de gauche; pour les clés qui existent dans les deux tableaux, les éléments du tableau de gauche seront utilisés et les éléments correspondants du tableau de droite seront ignorés.

Mark Eirich
la source
3
@andrewtweber Non, je ne le fais pas, mais j'ai fait des tests et j'ai trouvé que, comparé à l'approche d'Emil, il est 3 fois plus rapide et prend deux fois moins de mémoire. J'ai également constaté que cela prend 20% de temps de plus que de déplacer le même élément à la fin du tableau.
Mark Eirich
5

Si vous avez des clés de tableau numériques et que vous souhaitez réindexer les clés de tableau, il serait préférable de les mettre array_mergecomme ceci:

$myArray = array_merge(array($key => $value) + $myArray );
trante
la source
2

Un peu tard, mais au cas où quelqu'un en aurait besoin, j'ai créé ce petit extrait.

function arr_push_pos($key, $value, $pos, $arr) 
{
    $new_arr = array();
    $i = 1;

    foreach ($arr as $arr_key => $arr_value) 
    {
        if($i == $pos) 
            $new_arr[$key] = $value;

        $new_arr[$arr_key] = $arr_value;

        ++$i;
    }

    return $new_arr;
}

Ajustez-le simplement selon vos besoins ou utilisez-le et désactivez l'index pour qu'il bouge. Fonctionne également avec les tableaux associatifs.

Sune
la source
Une correction: $ new_arr [$ arr_key] = $ arr_value; Doit être: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Mais sinon: excellent! 1up.
nzn
1

Voici un autre simple one-liner qui permet de le faire en utilisant array_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;
Billynoah
la source
1

si vous avez 2 tableaux, le 1er a des éléments à déplacer en haut du 2ème tableau d'éléments, vous pouvez utiliser

$result = \array_replace($ArrayToMoveToTop, $myArray);

Voici un exemple de code:

//source array    
$myArray = [
    'two' => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one' => 'Blah Blah Blah 1',
    'four' => 'Blah Blah Blah 4',
    'five' => 'Blah Blah Blah 5',
];
// set necessary order
$orderArray = [
    'one' => '',
    'two' => '',
];
//apply it
$result = \array_replace($orderArray, $myArray);
\print_r($result);
Eugène Kaurov
la source
-1

Il y a une fonction dans les commentaires du manuel PHP pour array_unshift qui peut être utilisée pour ajouter un élément, avec clé, au début d'un tableau:

function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    return array_reverse($arr, true);
}

Désactivez l'élément et réinsérez-le à nouveau avec la fonction ci-dessus:

$tmp = $myArray['one'];
unset($myArray['one']);
$myArray = array_unshift_assoc($myArray, 'one', $tmp);

Une approche plus générale peut être d'utiliser uksort pour trier votre tableau par clés et fournir votre propre fonction de tri.

Emil Vikström
la source
Salut - merci pour la réponse, même si je ne veux en aucun cas trier le tableau. Je veux pouvoir connaître une clé d'éléments et déplacer uniquement cet élément spécifique au début du tableau
Je pense que le "=" est une erreur de syntaxe:return = array_reverse($arr, true);
Mark Eirich
De plus, lorsque
j'exécute