Commutateur de deux éléments dans un tableau associatif
Exemple:
$arr = array(
'apple' => 'sweet',
'grapefruit' => 'bitter',
'pear' => 'tasty',
'banana' => 'yellow'
);
Je veux changer les positions de pamplemousse et de poire, de sorte que le tableau va devenir
$arr = array(
'apple' => 'sweet',
'pear' => 'tasty',
'grapefruit' => 'bitter',
'banana' => 'yellow'
)
Je sais que les clés et les valeurs des éléments que je veux changer, est-il un moyen facile de faire cela? Ou aurez-vous besoin d'une boucle de + la création d'un nouveau tableau?
Grâce
OriginalL'auteur leon.nk | 2010-03-15
Vous devez vous connecter pour publier un commentaire.
Il n'est pas facile, juste une boucle ou d'une nouvelle définition de tableau.
Je suis d'accord avec Lex. PHP ne fournit pas de fonction native pour permuter les éléments de tableau. Vous pouvez probablement écrire votre propre avec une combinaison du reste de la matrice de fonctions et de beaucoup de patience, mais, honnêtement, la réécriture de l'éventail complet avec une boucle foreach est de loin la méthode la plus simple. Une coutume fonction d'échange n'est pas en vaut la peine, sauf si vous manipulez des tableaux de très grande taille et, dans de tels cas, vous devriez probablement refonte de la partie du code de la logique.
Est-ce censé être une réponse? Eh bien, j'ai justement le même problème. J'ai besoin d'inverser l'ordre des deux éléments dans un tableau
Oui, ce n'est répondre à la question, mais Metti réponse est ce que les gens vont être à la recherche pour (bien noter les commentaires).
OriginalL'auteur OverLex
Juste un peu plus court et moins complexe que la solution de arcaneerudite:
Testé et fonctionne très bien
En effet, mais après la résolution de ce problème, il serait de servir le but désiré.
+1, ce qui semble être parfait pour la permutation des éléments de tableaux de grande taille. Pour les petits, simples, deux éléments de swap, je serais beaucoup plus préfèrent un solution directe! :]
mais les solutions ne permet pas de conserver les clés!
Oui, tu as raison-il ne sera pas.
OriginalL'auteur metti
Voici ma version de la fonction de permutation:
OriginalL'auteur ttk
si le tableau provient de la db, ajouter un sort_order le terrain de sorte que vous pouvez toujours être sûr dans quel ordre les éléments dans le tableau.
OriginalL'auteur dazz
Cela peut ou peut ne pas être une option en fonction de votre cas d'utilisation, mais si vous initialisez votre tableau avec des valeurs null avec les touches appropriées avant de l'alimenter avec des données, vous pouvez définir les valeurs dans n'importe quel ordre et la clé d'origine-la commande sera maintenue. Ainsi, au lieu de la permutation des éléments, vous pouvez éviter la nécessité de l'échange entièrement:
...
OriginalL'auteur keithjgrant
Pas entièrement sûr si cela a été mentionné, mais, la raison c'est délicat, parce que c'est non-indexés.
Prenons:
Obtenir les clés:
Obtenir les valeurs:
Maintenant vous avez 2 tableaux numériques. Permuter les indices de celles que vous souhaitez changer, puis de lire l'autre tableau dans l'ordre de la modification du tableau numérique. Disons que nous voulons inverser "fruits" et "légumes": les
Maintenant, vous pouvez revenir à l'écran initial du tableau:
Maintenant, vous pouvez construire un tableau en passant par la oringal tableau dans l'ordre de la réarrangés clés.
Je n'ai pas testé mais c'est ce à quoi je m'attends. Est-ce à moins de fournir de l'aide? Bonne chance 🙂
Vous pourriez mettre cela dans une fonction
$arrNew = array_swap_assoc($key1,$key2,$arrOld);
AVERTISSEMENT: s'il vous Plaît tester et déboguer ce avant de l'utiliser - aucun test n'a été fait à tous.
OriginalL'auteur arcaneerudite
Classique tableau associatif n'est pas de définir ou de garantie séquence d'éléments de toute façon. Il est clair matrice/vecteur pour que les. Si vous utilisez un tableau associatif vous êtes supposé besoin d'un accès aléatoire, mais pas séquentiel. Pour moi, vous êtes à l'aide de assoc tableau pour tâche, il n'est pas fait pour.
si vous voyez que j'ai écrit "Classique tableau associatif", pas "php tableau associatif". La fonction asort est spécifique à php de mise en œuvre. de nouveau ce que j'ai dit est correct, on devrait assoc tableaux pour un accès aléatoire. si les gens de soins de regarder un peu plus large que juste en PHP...
Quel est le problème de l'utilisation de PHP implémentations lors du codage en PHP? Avez-vous écrire la langue agnostique code PHP? Pour quoi? De sorte que vous pouvez exécuter votre PHP avec un interpréteur Perl? 😕
la clé, c'est qu'assoc tableau a été fait pour "random access". si vous essayez de l'utiliser pour un accès séquentiel le plus probablement que vous l'avez conçu votre code de manière incorrecte.
-1 parce que l'ordre est bien définie et prise en charge de php.
OriginalL'auteur Andrey
ouais je suis d'accord avec Lex, si vous utilisez un tableau associatif pour contenir des données, pourquoi ne pas utiliser votre logique poignée de la façon dont ils sont accessibles au lieu de dépendre de la façon dont ils sont disposés dans le tableau.
Si vous avez vraiment envie de s'assurer qu'ils étaient dans un bon ordre, en essayant de créer des fruits des objets et de les mettre dans un tableau normal.
OriginalL'auteur Bryan Clark
Il n'y a pas de moyen facile de le faire. Cela sonne comme un léger design à la logique de l'erreur de votre part, ce qui a conduit à essayer de le faire quand il ya une meilleure façon de faire tout ce que vous êtes désireux de le faire. Pouvez-vous nous dire pourquoi vous voulez faire ça?
Vous dire que
I know the keys and values of the elements I want to switch
qui me fait penser que ce que vous voulez vraiment est une fonction de tri puisque vous pouvez facilement accéder à des éléments nécessaires quand vous le voulez comme ils sont.Si c'est le cas alors je voudrais utiliser sort(), ksort() ou une des nombreuses autres fonctions de tri pour obtenir la matrice de la façon dont vous le souhaitez. Vous pouvez même utiliser usort() à
Sort an array by values using a user-defined comparison function
.D'autres que vous pouvez utiliser array_replace() si jamais vous avez besoin de swap de valeurs ou de clés.
OriginalL'auteur Xeoncross
Voici deux solutions. Le premier est plus long, mais ne pas créer un tableau temporaire, de sorte qu'il économise de la mémoire. Le deuxième court sans doute plus rapide, mais utilise plus de mémoire:
OriginalL'auteur Matthew
fwiw, voici une fonction pour échanger deux éléments adjacents à mettre en œuvre moveUp() ou moveDown() dans un tableau associatif sans foreach()
OriginalL'auteur Steve
Il existe un moyen simple:
et vous obtenez:
OriginalL'auteur Eugene Kaurov
OriginalL'auteur user2676860
Bien c'est juste une clé de tri problème. Nous pouvons utiliser
uksort
à cette fin. Il a besoin d'une touche de fonction de comparaison et nous avons seulement besoin de savoir qu'il doit retourner 0 pour laisser les clefs de la position intacte et autre chose que 0 pour déplacer touche vers le haut ou vers le bas.Avis qu'il ne fonctionnera que si vos clés, vous voulez échanger sont les unes à côté des autres.
OriginalL'auteur Karol Samborski
Je vais partager ma version courte trop, il travaille à la fois numérique et des tableaux associatifs.
Renvoie un nouveau tableau avec les deux éléments échangés. Il préserver les clés originales si spécifié. Retourne FALSE si les touches ne sont pas trouvés.
Par exemple:
OriginalL'auteur SubjectDelta
J'ai écrit une fonction avec plus d'usage général, avec ce problème à l'esprit.
fonction order_array($array, $ordre) {
J'espère que c'est pertinent et utile pour quelqu'un
OriginalL'auteur G4Hu
Tableaux en php sont commandés cartes.
ne veut pas dire que le premier élément est "pomme" =>'doux' et le dernier - 'banane'=>'jaune' juste parce que vous mettez de "pomme" en premier et "banane" en dernier. En fait, 'pomme'=> "douce" sera le premier et
'banane'=>'jaune' sera la deuxième cause de alphabétique ordre de tri croissant.
ksort()
. Tableaux indexés maintenir leur commande (par exemple. l'ordre dans lequel les éléments du tableau sont initialisés)-1 par défaut, les éléments sont implicitement commandé par le temps qu'une clé a été initialisé.
OriginalL'auteur a1ex07