Array sort

Petit nouveau ! | 9 Messages

24 juil. 2007, 11:00

Hello,

Voilà, j'aurais besoin de trier les informations dans un tableau multidimensionel, mais je comprend pas exactement comment fonctionne .... la fonction.

Voici un extrait de mon tableau. En gros il faudrait que je puisse le trier pas "country_name", du coup Russia apparaitrait tout en bas.

Merci d'avance

Sylk


Array
(
    [0] => Array
        (
            [country_name] => Russia
        )

    [1] => Array
        (
            [country_name] => Australia
            [b_nau_com] => 1
        )

    [2] => Array
        (
            [country_name] => Austria
            [b_nau_com] => 1
        )
)


ViPHP
ViPHP | 928 Messages

24 juil. 2007, 11:20

Bonjour, tu dois utiliser usort(), comme ceci :
function usort_callback($a, $b)
{
   return (strcmp($a['country_name'], $b['country_name']));
}

usort($ton_tableau, 'usort_callback');

ViPHP
ViPHP | 4674 Messages

24 juil. 2007, 11:29

Salut :)

Tu as plusieurs solutions pour trier ton tableau.
Soit tu revois l'architecture, de façon à avoir quelques choses qui ressemble à ça :

Code : Tout sélectionner

Array ( country_name => Array ( 0 => Russia, 1 => Australia, 2 => Austria ), b_nau_com => Array ( 0 => null, 1 => 1, 2 => 1 ) )
Dans ce cas, tu n'auras pas de problème. Tu tries simplement :
sort($array['country_name'], SORT_STRING);
Et tu retrouveras toutes tes données par association de clés.


Ou alors, si tu ne veux pas toucher à la structure, il y a une possibilité, mais c'est un peu plus compliqué. Ce système à l'avantage de pouvoir faire beaucoup de tries sur plusieurs données en même temps (même des inversions de tries etc.) :
<?php

header('content-type: text/plain');

// Ton tableau de base, on n'a pas touché à l'architecture.
$array = array(
    0 => array('country_name' => 'Russia'),
    1 => array('country_name' => 'Australia',
               'b_nau_com'    => 1),
    2 => array('country_name' => 'Austria',
               'b_nau_com'    => 1)
);

// On prépare les 2 variables.
// Sort est celle qui va avoir les noms des pays triés.
$sort   = array();
// Return est celle qui va contenir le résultat : ton tableau trié.
$return = array();

// On récupère tous les noms des pays dans le tableau sort.
foreach($array as $i => $value)
    $sort[] = $value['country_name'];

// On trie ce tableau sans modifier les clés.
// C'est le but de la fonction asort.
asort($sort, SORT_STRING);

// Par association de clés, on reconstruit ton tableau trié.
foreach($sort as $i => $foo)
    $return[] = $array[$i];

print_r($sort);
print_r($array);
print_r($return);
Ton résultat sera ($return) :

Code : Tout sélectionner

Array ( [0] => Array ( [country_name] => Australia [b_nau_com] => 1 ) [1] => Array ( [country_name] => Austria [b_nau_com] => 1 ) [2] => Array ( [country_name] => Russia ) )
Explore bien les fonctions de trie, il y en a beaucoup, et sont puissantes. Ici, je t'ai introduit la fonction asort(), qui permet de trier sans toucher aux clés. On voit l'avantage rapidement : on ne trie qu'une partie, on récupère les clés, et on reconstruit le tableau par association de clés.

C'est une méthode parmi tant d'autres. Je ne sais pas si c'est la meilleur, mais elle est rapide à concevoir :P

Edit : ou tu peux utiliser usort .... Je l'avais oublié celle là :cry:. (La guerre est déclarée ;-))
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 9 Messages

24 juil. 2007, 11:47

Woua,

Je sais pas ce que ferai un codeur (aussi débutant soit-il...) sans les forums! T'as la solution qu'il te faut en 2 min. Ou du moins un piste, qui te permet de résoudre ton problème rapidement. De la balle.

Merci Genova, la fonction usort() fonctionne parfaitement pour ça (bien que je n'ai pas encore compris à 100% son fonctionnement). Merci à toi aussi mHyWaN, j'avais pas pensé à cette solution. Elle me sera surement utile un ces jours.

Bon appétit

Sylk

ViPHP
ViPHP | 4674 Messages

24 juil. 2007, 11:53

L'avantage avec la mienne, c'est qu'on peut faire le trie qu'on veut en travaillant sur les bytes, et trier plusieurs données entre elles, mais il faut pousser un peu plus le script. Mais pour un tableau simple et un trie simple, utilise usort.

Tu n'as pas bien compris le fonctionnement d'usort ? Regarde la documentation, elle l'explique bien :)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 928 Messages

24 juil. 2007, 11:53

Pour le fonctionement de la fonction usort() elle est pas simple à comprendre, je te conseil de lire la doc qui la concerne pour la comprendre.