IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

array_multisort() et clés numériques à 10 caractères sous forme de chaîne


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut array_multisort() et clés numériques à 10 caractères sous forme de chaîne
    Bonjour,

    J'ai ce problème avec un tableau dont les clés sont basés sur des numéros de téléphone à 10 chiffres. Une fois que j'utilise array_multisort() je perds les clés dont les valeurs sont plus bases. Je soupçonne que c'est parce que certaines clés sont converties en entiers et pas d'autres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $a = ["4185550123" => "A", "2045550155" => "C", "5145551230" => "B"];
    $b = ["A", "C", "B"];
    array_multisort($b, SORT_STRING, SORT_ASC, $a);
    print_r($a); //Array ( [4185550123] => A [5145551230] => B [0] => C )
    Dans ce cas, actuellement, je ne peux donc pas utiliser les clés comme références. Je ne trouve pas de solution pour empêcher les clés de se détériorer ainsi. Des idées?
    Pensez à la balise

  2. #2
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Citation Envoyé par http://php.net/manual/fr/language.types.array.php
    La clé key peut être soit un integer, soit une chaîne de caractères. La valeur value peut être de n'importe quel type.

    De plus, les modifications de type pour la clé key peuvent survenir :

    Les chaînes de caractères contenant un entier valide seront modifiées en un type entier. I.e. la clé "8" sera actuellement stockée comme l'entier 8. D'un autre côté, "08" se sera pas modifié, sachant que ce n'est pas un entier décimal valide.
    Les nombres à virgule flottante seront aussi modifiés en entier, ce qui signifie que la partie après la virgule sera tronquée. I.e. la clé 8.7 sera stockée sous l'entier 8.
    Les booléens seront modifiés en entier également, i.e. la clé true sera stockée sous l'entier 1 et la clé false sous l'entier 0.
    La valeur Null sera modifiée en une chaîne vide, i.e. la clé null sera stockée sous la chaîne de caractère "".
    Les tableaux et les objets ne peuvent pas être utilisés comme clé. Si vous le tentez, l'alerte suivante sera émise : Illegal offset type.
    Partant de ce principe on arrive au fonctionnement de la fonction array_multisort : Les clé de type entier son réindexées à partir de 0.
    A ma connaissance il n'y a pas possibilité d'outrepasser ce comportement (à moins de préfixer les clés par 0 par exemple, mais là tu détériores aussi les clés en un sens...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $a = array("4185550123" => "A", "2147483646" => "C", "5145551230" => "B", "02147483646" => "D");
    var_dump($a);
    array_multisort($a, SORT_STRING, SORT_ASC);
    var_dump($a);
    array (size=4)
    '4185550123' => string 'A' (length=1)
    2147483646 => string 'C' (length=1)
    '5145551230' => string 'B' (length=1)
    '02147483646' => string 'D' (length=1)

    array (size=4)
    '4185550123' => string 'A' (length=1)
    '5145551230' => string 'B' (length=1)
    0 => string 'C' (length=1)
    '02147483646' => string 'D' (length=1)

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  3. #3
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    En faisant quelque chose du genre, ça passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    $a = ["4185550123" => "A", "2045550155" => "C", "5145551230" => "B"];
    $aKeys = array_keys($a);
    $aValues = array_values($a);
    array_multisort($aKeys, SORT_STRING, SORT_ASC, $aValues);
     
    $aSort = array_combine($aKeys,$aValues);
     
    var_dump($aSort);
    array(3) { [2045550155]=> string(1) "C" ["4185550123"]=> string(1) "A" ["5145551230"]=> string(1) "B" }
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  4. #4
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Logique, sauf que cela ne répond pas au problème initial vu que ton sort ne fait pas ce qui est voulu (CAB != ABC).

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  5. #5
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Ah pardon tu veux faire le trie dans l'autre sens.
    Juste à changer le multisort alors.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $a = ["4185550123" => "A", "2045550155" => "C", "5145551230" => "B"];
    $aKeys = array_keys($a);
    $aValues = array_values($a);
    array_multisort($aValues, SORT_STRING, SORT_ASC, $aKeys);
     
    $aSort = array_combine($aKeys,$aValues);
     
    var_dump($aSort);
    array(3) { ["4185550123"]=> string(1) "A" ["5145551230"]=> string(1) "B" [2045550155]=> string(1) "C" }
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  6. #6
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Très intéressant.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  7. #7
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Merci pour votre apport sur le sujet. Il semble donc, comme je le croyais, qu'il n'est pas possible de s'en sortir sans manipulation des clés à l'extérieur de la fonction array_multisort(). Soit.
    Pensez à la balise

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Évaluation d'une expression numérique sous forme de chaîne de caractères
    Par InitSreen dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 29/11/2020, 08h43
  2. Réponses: 3
    Dernier message: 01/03/2014, 19h12
  3. [XL-2010] Macro - SUM sous forme de chaîne de caractères
    Par Rototo912 dans le forum Excel
    Réponses: 9
    Dernier message: 27/02/2014, 12h48
  4. Interpréter une formule saisie sous forme de chaîne de caractères
    Par Pozzo dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 29/05/2013, 09h30
  5. Réponses: 17
    Dernier message: 08/12/2008, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo