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 :

Je cale sur le tri d'un tableau [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Je cale sur le tri d'un tableau
    Bonjour à tous,

    Soit le tableau suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    Array
    (
        [1238] => Array
            (
                [4] => 181
                [5] => 189
                [6] => 176
                [7] => 152
                [8] => 147
                [9] => 132
                [10] => 173
                [11] => 168
                [12] => 160
            )
     
        [1242] => Array
            (
                [4] => 209
                [5] => 244
                [6] => 218
                [7] => 242
                [8] => 173
                [9] => 204
                [10] => 315
                [11] => 198
                [12] => 197
            )
     
        [1241] => Array
            (
                [4] => 154
                [5] => 217
                [6] => 183
                [7] => 204
                [8] => 151
                [9] => 170
                [10] => 206
                [11] => 196
                [12] => 180
            )
     
        [1240] => Array
            (
                [4] => 5
                [5] => 9
                [6] => 3
                [7] => 7
                [8] => 10
                [9] => 8
                [10] => 4
                [11] => 9
                [12] => 5
            )
    )
    les clés sont des id de produits et les sous_tableaux associés ont des mois comme clés et des ventes comme valeurs.
    La partie ci-dessus n'est qu'une petite partie du tableau, qui comporte 600 produits. L'idée est que je voudrais éliminer les clés et tableaux associés dont la somme des ventes est inférieure à 300. Dans mon exemple la clé 1240 devra être supprimée.
    Mais je tourne en rond.
    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    ça tient en deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sums = array();
    array_walk($data, function($v, $k) use (&$sums) { (($sum = array_sum($v)) >= 300) ? ($sums[$k] = $sum) : ''; });
    et pour conserver tes données initiales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sums = array();
    array_walk($data, function($v, $k) use (&$sums) { (array_sum($v) < 300) ?: ($sums[$k] = $v); });

  3. #3
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Hello !

    ça tient en deux lignes :
    Oui...mais alors quelles lignes !!!


    Je te remercie beaucoup. Et maintenant, histoire de me coucher moins crétin, je vais tenter de comprendre ce code.
    Bonne soirée.

  4. #4
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Euh...juste une chose : ce code, dès qu'on le met dans une fonction avec le tableau et la limite en paramètre, retourne $sums tout farfelu.
    Pourquoi ?

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Euh...juste une chose : ce code, dès qu'on le met dans une fonction avec le tableau et la limite en paramètre, retourne $sums tout farfelu.
    Pourquoi ?
    C'est parce que je pense que tu as oublié de passer la limite dans le use().
    Voici un code qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
     
    $values = array(
       1238 => array(4 => 181, 189, 176, 152, 147, 132, 173, 168, 160 ),
       1242 => array(4 => 209, 244, 218, 242, 173, 204, 315, 198, 197 ),
       1241 => array(4 => 154, 217, 183, 204, 151, 170, 206, 196, 180),
       1240 => array(4 => 5, 9, 3, 7, 10, 8, 4, 9, 5)
    );
     
    function filterData(array $data, $limit, $return_sums = true)
    {
       $filtered = array();
       array_walk($data,
          function($v, $k) use (&$filtered, $limit, $return_sums)
          {
             if (($sum = array_sum($v)) >= $limit) {
                $filtered[$k] = ($return_sums) ? $sum : $v;
             }
          }
       );
       return $filtered;
    }
     
    print_r(filterData($values, 300));
     
    ?>

  6. #6
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour,

    En appliquant cette fonction à mon tableau, je vois que le nombre d'enregistrement retourné correspond à la somme mini passée en paramètre...mais il est vide. Les données ont été perdues.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function cree_tableau(){
    //boucle qui crée le tableau
     
    return filterData($tab, 300);
     
    }
     
    function recup_tableau(){
    $tab = cree_tableau();
    print_r($tab); //array est vide
    }
    Alors que si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function cree_tableau(){
    //boucle qui crée le tableau
     
    print_r(filterData($tab, 300));
     
    }
    C'est OK.
    Quel est ce sortilège ???

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu as bien remarqué qu'il y a avait un 3ème paramètre d'appel : $return_sums qui permet de spécifier les données du tableau filtré : sommes ou valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // tableau de sommes
    filterData($tab, 300);
     
    // tableau de valeurs
    filterData($tab, 300, false);

  8. #8
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut


    Chapeau bas, Monsieur.
    Mille mercis et bonne journée.

  9. #9
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Au risque d'abuser de tes compétences, rawsrc, si tu repasses par là, peux-tu me dire si un tel tableau est triable par la somme des sous-tableaux ?
    J'ai pensé ajouter une colonne "somme" et trier dessus...mais ça flingue le tableau...
    Est-ce dans ta fonction qu'il faut intervenir ?

  10. #10
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    ça non plus c'est pas très compliqué :
    tu récupères le tableau des sommes, que tu tries avec asort() et ensuite tu peux très bien récupérer les valeurs vu que tu as les clés (triées) du tableau initial.
    Bref, rien de bien compliqué à l'horizon.

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    ça te fait trois lignes en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $values = array(
       1238 => array(4 => 181, 189, 176, 152, 147, 132, 173, 168, 160 ),
       1242 => array(4 => 209, 244, 218, 242, 173, 204, 315, 198, 197 ),
       1241 => array(4 => 154, 217, 183, 204, 151, 170, 206, 196, 180),
       1240 => array(4 => 5, 9, 3, 7, 10, 8, 4, 9, 5)
    );
     
    function filterData(array $data, $limit, $return_sums = true)
    {
       $filtered = array();
       array_walk($data,
          function($v, $k) use (&$filtered, $limit, $return_sums)
          {
             if (($sum = array_sum($v)) >= $limit) {
                $filtered[$k] = ($return_sums) ? $sum : $v;
             }
          }
       );
       return $filtered;
    }
     
    $tab_filtre = filterData($values, 300);
     
    asort($tab_filtre); //employer "arsort" pour ordre décroissant
     
    $tab_tri = array_intersect_key($values,$tab_filtre);//PHP 5 >= 5.1.0
    $tab_tri = array_replace($tab_filtre,$tab_tri);//PHP 5 >= 5.3.0
     
    echo '<pre>';
    print_r($tab_tri);
    echo '</pre>';

  12. #12
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Euh...je tente de récupérer $sum dans la fonction en le passant dans un autre tableau, mais rien à faire il est vide.
    En fait je ne comprends pas très bien comment cette fonction est construite...
    Je vais creuser.

  13. #13
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Alors on va plus simple,
    je voulais rester sur array_walk car j'étais parti dessus au premier post mais on peut très bien s'en passer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
     
    $values = array(
       1238 => array(4 => 181, 189, 176, 152, 147, 132, 173, 168, 160 ),
       1242 => array(4 => 209, 244, 218, 242, 173, 204, 315, 198, 197 ),
       1241 => array(4 => 154, 217, 183, 204, 151, 170, 206, 196, 180),
       1240 => array(4 => 5, 9, 3, 7, 10, 8, 4, 9, 5)
    );
     
    function filterData(array $data, $limit, $return_sums = true)
    {
       $filtered = array();
       foreach($data as $k => $v) {
          if (($sum = array_sum($v)) >= $limit) {
             $filtered[$k] = ($return_sums) ? $sum : $v;
          }
       }
       return $filtered;
    }
     
    $sums = filterData($values, 300);
    asort($sums, SORT_NUMERIC);
     
    $sorted = array();
    foreach($sums as $k => $sum) {
       $sorted[$k] = $values[$k];
    }
     
    ?>

  14. #14
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Merci de votre aide, les gars, c'est vraiment très sympa. J'avoue que je suis un peu dépassé, là.

    ABCIWEB : ta fonction trie bien dans un sens ou dans l'autre mais on perd la limite des sommes de la fonction de rawsrc

    rawsrc : ta fonction retourne un tableau bien limité mais, j'ai utilisé arsort et les sommes ne sont pas vraiment triées. Avec sort non plus, c'est un peu aléatoire.

    En tout cas c'est tout proche.

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    ABCIWEB : ta fonction trie bien dans un sens ou dans l'autre mais on perd la limite des sommes de la fonction de rawsrc
    Cela retourne bien le tableau initial trié dans l'ordre des sommes après l'application de la fonction de filtre (limite 300). C'est pas cela que tu voulais ?

    Remarque que si tu ne veux pas appliquer le filtre avant le tri tu peux mettre 0 dans le filtre ainsi tu as ton tableau uniquement trié mais pas filtré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $tab_filtre = filterData($values, 0);
     
    asort($tab_filtre); //employer "arsort" pour ordre décroissant
     
    $tab_tri = array_intersect_key($values,$tab_filtre);//PHP 5 >= 5.1.0
    $tab_tri = array_replace($tab_filtre,$tab_tri);//PHP 5 >= 5.3.0
     
    echo '<pre>';
    print_r($tab_tri);
    echo '</pre>';

  16. #16
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    rawsrc : ta fonction retourne un tableau bien limité mais, j'ai utilisé arsort et les sommes ne sont pas vraiment triées. Avec sort non plus, c'est un peu aléatoire.
    Je pense que qu'il y a un passage que t'as loupé. J'ai repris mon dernier code en mélangeant les données d'entrées et j'ai bien un tri ascendant sur la somme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
     
    $values = array(
       1242 => array(4 => 209, 244, 218, 242, 173, 204, 315, 198, 197 ), // sum = 1661
       1238 => array(4 => 181, 189, 176, 152, 147, 132, 173, 168, 160 ), // sum = 1478
       1241 => array(4 => 154, 217, 183, 204, 151, 170, 206, 196, 180),  // sum = 2000
       1240 => array(4 => 5, 9, 3, 7, 10, 8, 4, 9, 5)                    // sum =   60 => (< 300) => rejeté
    );
     
    function filterData(array $data, $limit, $return_sums = true)
    {
       $filtered = array();
       foreach($data as $k => $v) {
          if (($sum = array_sum($v)) >= $limit) {
             $filtered[$k] = ($return_sums) ? $sum : $v;
          }
       }
       return $filtered;
    }
     
    echo '<pre>';
    $sums = filterData($values, 300);
    print_r($sums);
    echo '<br />';
    asort($sums, SORT_NUMERIC);
    print_r($sums);
     
    $sorted = array();
    foreach($sums as $k => $sum) {
       $sorted[$k] = $values[$k];
    }
     
    ?>
    Tu peux le vérifier toi-même avec le code ci-dessus.

  17. #17
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Alors je pense qu'un truc ne va pas dans mon tableau, parce que, en testant les deux méthodes, j'obtiens bien le tableau limité à 300 mais le tri descendant, avec arsort n'est pas parfait. Des inversions des sommes on lieu.

    rawsrc : j'ai appliqué ta fonction comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function cree_tab(){
    $tab_result = array();
    while($row = mysql_fetch_assoc($sql)){
        $tab_result[$row['produit_id']][$row['mois']] = $row['ventes'];
    }
    $sums = filterData($tab_result, 300, false);
    asort($sums, SORT_NUMERIC);
     
    $sorted = array();
    foreach($sums as $k => $sum) {
       $sorted[$k] = $tab_result[$k];
    }
    return $sorted;
    }
    Et j'ai testé ton exemple, il fonctionne. Rien à dire.

    ABCIWEB : j'ai utilisé ta fonction comme ci-dessus, mais j'obtiens aussi un ordre farfelu.
    Je vois pas ce que je loupe.
    Mon tableau a un grand nombre de données mais quand même...

    Mon tableau, de base est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Array
    (
        [1238] => Array
            (
                [4] => 181
                [5] => 189
                [6] => 176
                [7] => 152
                [8] => 147
                [9] => 132
                [10] => 173
                [11] => 168
                [12] => 160
            )
     
        [1242] => Array
            (
                [4] => 209
                [5] => 244
                [6] => 218
                [7] => 242
                [8] => 173
                [9] => 204
                [10] => 315
                [11] => 198
     
            )
    )
    Les clés sont des mois, et les ventes sont les valeurs. Mais les clés (mois) ne sont pas forcément toujours présentes comme l'exemple ci-dessus. Peut-être que ça fout un peu la glaise ?

  18. #18
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu fais une erreur ici (ligne 7) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sums = filterData($tab_result, 300, false);
    Si tu n'as pas modifié ma fonction, cela devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sums = filterData($tab_result, 300);

  19. #19
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    Pour mon code, c'est sans doute que tu n'utilise pas php5.3 ce qui doit poser un problème avec array_replace...

    Parce qu'en testant chez moi, j'ai exactement le même résultat si je fais ça (premier code de rawsrc que j'ai complété) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $values = array(
       1242 => array(4 => 209, 244, 218, 242, 173, 204, 315, 198, 197 ), // sum = 1661
       1238 => array(4 => 181, 189, 176, 152, 147, 132, 173, 168, 160 ), // sum = 1478
       1241 => array(4 => 154, 217, 183, 204, 151, 170, 206, 196, 180),  // sum = 2000
       1240 => array(4 => 5, 9, 3, 7, 10, 8, 4, 9, 5)                    // sum =   60 => (< 300) => rejeté
    );
     
    function filterData(array $data, $limit, $return_sums = true)
    {
       $filtered = array();
       array_walk($data,
          function($v, $k) use (&$filtered, $limit, $return_sums)
          {
             if (($sum = array_sum($v)) >= $limit) {
                $filtered[$k] = ($return_sums) ? $sum : $v;
             }
          }
       );
       return $filtered;
    }
     
    $tab_filtre = filterData($values, 300);
     
    asort($tab_filtre); //employer "arsort" pour ordre décroissant
     
    $tab_tri = array_intersect_key($values,$tab_filtre);//PHP 5 >= 5.1.0
    $tab_tri = array_replace($tab_filtre,$tab_tri);//PHP 5 >= 5.3.0
     
    echo '<pre>';
    print_r($tab_tri);
    echo '</pre>';
    ou ça (dernier code de rawsrc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $values = array(
       1242 => array(4 => 209, 244, 218, 242, 173, 204, 315, 198, 197 ), // sum = 1661
       1238 => array(4 => 181, 189, 176, 152, 147, 132, 173, 168, 160 ), // sum = 1478
       1241 => array(4 => 154, 217, 183, 204, 151, 170, 206, 196, 180),  // sum = 2000
       1240 => array(4 => 5, 9, 3, 7, 10, 8, 4, 9, 5)                    // sum =   60 => (< 300) => rejeté
    );
     
    function filterData(array $data, $limit, $return_sums = true)
    {
       $filtered = array();
       foreach($data as $k => $v) {
          if (($sum = array_sum($v)) >= $limit) {
             $filtered[$k] = ($return_sums) ? $sum : $v;
          }
       }
       return $filtered;
    }
     
     
    $sums = filterData($values, 300);
     
    asort($sums, SORT_NUMERIC);
     
     
    $sorted = array();
    foreach($sums as $k => $sum) {
       $sorted[$k] = $values[$k];
    }
     echo '<pre>';
     print_r($sorted);
    echo '<br />';
    Enfin bon l'important est que tu aies trouvé quelque chose qui te convienne.

  20. #20
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour !

    Et oui, je faisais une erreur en rajoutant "false" dans les paramètres et du coup maintenant ça fonctionne comme sur des roulettes !
    J'ai PHP 5.3.8. Mais bon, c'est maintenant parfait.
    Vous êtes des as et franchement, merci pour votre patience et votre sympathie...

    Bonne journée à tous.
    Renaud.

    Cette fois, ce post est vraiment résolu !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/09/2008, 13h41
  2. Exercice sur le tri d'un tableau
    Par momo1367 dans le forum Pascal
    Réponses: 1
    Dernier message: 16/04/2008, 19h28
  3. Réponses: 2
    Dernier message: 06/09/2007, 15h08
  4. [Tableaux] Tri alphabétique sur des colonnes d'un tableau html
    Par arnaudperfect dans le forum Langage
    Réponses: 1
    Dernier message: 02/04/2007, 15h51
  5. [Tableaux] Help sur un tri de tableau...
    Par abou76 dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2006, 15h01

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