Tri array sur une colonne non nommé [Résolu]

cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 1 sept. 2009 à 11:25 - Dernière réponse : Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention
- 2 sept. 2009 à 18:33
Bonjour à tous,

Je cherche à trier un tableau sur la 4ème colonne qui n'a pas de "nom" de colonne... pouvez vous m'aider svp ? Merci d'avance
J'ai essayé d'utiliser array_multisort sans succès :(

Exemple :

$pays[]=Array('Canada',6,true,'Amérique');
$pays[]=Array('France',1,false,'Europe');
$pays[]=Array('Mexique',5,false,'Amérique');
$pays[]=Array('Espagne',2,false,'Europe');
$pays[]=Array('Angleterre',3,true,'Europe');
$pays[]=Array('Etats-Unis',4,false,'Amérique');
$pays[]=Array('Brésil',7,false,'Amérique');

Dans ce tableau je souhaite que le principal tri s'effectue sur la 4ème colonne et un tri secondaire sur la 1ère colonne (avec possibilité de ASC DESC)
Je précise que je ne souhaite pas nommer les colonnes afin d'être généraliste par rapport au contenu.
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Bemale 24 Messages postés dimanche 26 janvier 2003Date d'inscription 11 septembre 2009 Dernière intervention - 2 sept. 2009 à 17:59
3
Merci
Sinon un truc comme ça
$pays=array();
$pays[]=Array('Canada',6,true,'Amérique');
$pays[]=Array('France',1,false,'Europe');
$pays[]=Array('Mexique',5,false,'Amérique');
$pays[]=Array('Espagne',2,false,'Europe');
$pays[]=Array('Angleterre',3,true,'Europe');
$pays[]=Array('Etats-Unis',4,false,'Amérique');
$pays[]=Array('Brésil',7,false,'Amérique');

foreach ($pays as $key => $tab_pays) {
    $continent[$key]  = $tab_pays[3];
    $nom_pays[$key] = $tab_pays[0];
}
array_multisort($continent, SORT_ASC, $nom_pays, SORT_ASC, $pays);


pour plus d'info voir la fonction multisort Fonction multisort (PHP4 et PHP5)

Merci Bemale 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de Bemale
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 1 sept. 2009 à 13:35
0
Merci
Peut être un début de réponse...

J'utilise cette class que j'ai trouvée ici : http://www.php.net/manual/fr/function.usort.php dans les exemples puis modifiée pour en autres supporter les jeux de caractères avec accents...

En revanche le tri se fait que sur un niveau... Mais en passant par des sous-tableaux...
<?php
/*
Class trouvée ici : http://www.php.net/manual/fr/function.usort.php
Modifiée pour supporter les jeux de caractères avec accents
*/
class ObjSorter
{
var $property;
var $sorted;
var $order;
function ObjSorter($objects_array,$property=null, $order="asc")
{
$order=strtoupper($order);
switch($order)
{
case "DESC":
break;
default:
$order="ASC";
break;
}
$this->order = $order;
$sample    = $objects_array[0];
$vars    = get_object_vars($sample);
if (isset($property))
{
if (isset($sample->$property))
{   
$this->property = $property;
usort($objects_array, array($this,'_compare'));
}
else
{   
$this->sorted    = false;
return;   
}
}
else
{   
list($property,$var)     = each($sample);
$this->property         = $property;
usort($objects_array, array($this,'_compare'));
}
$this->sorted    = ($objects_array);
}
function _compare($apple, $orange)
{
$property    = $this->property;
if ($this->collatedLower($apple[$property]) == $this->collatedLower($orange[$property])) return 0;
$order = $this->order;
if($order=="DESC")
return ($this->collatedLower($apple[$property]) > $this->collatedLower($orange[$property])) ? -1 : 1;
return ($this->collatedLower($apple[$property]) < $this->collatedLower($orange[$property])) ? -1 : 1;
}
function collatedLower($string) {
$string=strtolower($string);
$patterns = array(
"/á|à|â|ã|ä|å|
Á|À|Â|Ã|Ä|Å/",
"/æ|Æ/",
"/ç|Ç/",
"/é|è|ê|ë|
É|È|Ê|Ë/",
"/ì|í|î|ï|
Ì|Í|Î|Ï/",
"/ñ|Ñ/",
"/ò|ó|ô|õ|ö|ø|
Ò|Ó|Ô|Õ|Ö|Ø/",
"/&oelig;|&OElig;/",
"/ß/",
"/ù|ú|û|ü|
Ù|Ú|Û|Ü/",
"/ý|ÿ|Ý/");
$replace = array('a', 'ae', 'c', 'e', 'i', 'n', 'o', 'oe', 'ss', 'u', 'y');
   return preg_replace($patterns,$replace,$string);
}
}
$pays[]=Array('Canada',6,true,'Amérique');
$pays[]=Array('France',1,false,'Europe');
$pays[]=Array('Mexique',5,false,'Amérique');
$pays[]=Array('Espagne',2,false,'Europe');
$pays[]=Array('Angleterre',3,true,'Europe');
$pays[]=Array('Etats-Unis',4,false,'Amérique');
$pays[]=Array('Brésil',7,false,'Amérique');

$objects = new ObjSorter($pays,3, "ASC");
print_r($objects->sorted);
/*
Array
(
    [0] => Array
        (
            [0] => Canada
            [1] => 6
            [2] => 1
            [3] => Amérique
        )

    [1] => Array
        (
            [0] => Mexique
            [1] => 5
            [2] => 
            [3] => Amérique
        )

    [2] => Array
        (
            [0] => Brésil
            [1] => 7
            [2] => 
            [3] => Amérique
        )

    [3] => Array
        (
            [0] => Etats-Unis
            [1] => 4
            [2] => 
            [3] => Amérique
        )

    [4] => Array
        (
            [0] => Espagne
            [1] => 2
            [2] => 
            [3] => Europe
        )

    [5] => Array
        (
            [0] => France
            [1] => 1
            [2] => 
            [3] => Europe
        )

    [6] => Array
        (
            [0] => Angleterre
            [1] => 3
            [2] => 1
            [3] => Europe
        )

)
*/
?>
Commenter la réponse de Tonio_35
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 1 sept. 2009 à 13:51
0
Merci
La ca marche ca ! mais ca fait un peut usine a gaz...

<?php
$pays[]=Array('Canada',6,true,'Amérique');
$pays[]=Array('France',1,false,'Europe');
$pays[]=Array('Mexique',5,false,'Amérique');
$pays[]=Array('Espagne',2,false,'Europe');
$pays[]=Array('Angleterre',3,true,'Europe');
$pays[]=Array('Etats-Unis',4,false,'Amérique');
$pays[]=Array('Brésil',7,false,'Amérique');

$objects = new ObjSorter($pays,3, "ASC");

$i=0;
$temparr = array();
foreach($objects->sorted as $pays)
{
if(!isset($lastcont))
{
$temparr[$i] = array();
$lastcont = $pays[3];
array_push($temparr[$i], $pays);
}
elseif($lastcont != $pays[3])
{
$tmpobj = new ObjSorter($temparr[$i],0, "ASC");
$temparr[$i] = $tmpobj->sorted;
$i++;
$temparr[$i] = array();
array_push($temparr[$i], $pays);
$lastcont = $pays[3];
}
else
{
array_push($temparr[$i], $pays);
}
}
$tmparray = array();
for($t=0; $t<=$i;$t++)
{
$tmparray = array_merge($tmparray, $temparr[$t]);
}
print_r($tmparray);
/*
Array
(
    [0] => Array
        (
            [0] => Brésil
            [1] => 7
            [2] => 
            [3] => Amérique
        )

    [1] => Array
        (
            [0] => Canada
            [1] => 6
            [2] => 1
            [3] => Amérique
        )

    [2] => Array
        (
            [0] => Etats-Unis
            [1] => 4
            [2] => 
            [3] => Amérique
        )

    [3] => Array
        (
            [0] => Mexique
            [1] => 5
            [2] => 
            [3] => Amérique
        )

    [4] => Array
        (
            [0] => Espagne
            [1] => 2
            [2] => 
            [3] => Europe
        )

    [5] => Array
        (
            [0] => France
            [1] => 1
            [2] => 
            [3] => Europe
        )

    [6] => Array
        (
            [0] => Angleterre
            [1] => 3
            [2] => 1
            [3] => Europe
        )

)
*/
?>



_________________________________
Min iPomme
Commenter la réponse de Tonio_35
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 1 sept. 2009 à 14:06
0
Merci
Merci Tonio_35 :)

Effectivement cela fonctionne mais tu as raison c'est une usine à gaz !

Je suis surpris tout de même qu'il n'y ait pas beaucoup pus simple...

En tout cas en attendant cela fera l'affaire mais je laisse ouvert le post au cas quelqu'un aurait mieux (plus compréhensible, malléable et simple).
Commenter la réponse de cs_Valentino
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 1 sept. 2009 à 14:23
0
Merci
par contre je viens de m'apperçevoir qu'il y a une erreur (Invalid argument supplied for foreach()) sur le foreach($objects->sorted as $pays)...
Tu a une idée ? pour être franc je n'ai pas encore regardé en détail ton ta class ObjSorter
Commenter la réponse de cs_Valentino
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 1 sept. 2009 à 14:29
0
Merci
MmmmMmmm...

Php version 5 ?


_________________________________
Min iPomme
Commenter la réponse de Tonio_35
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 1 sept. 2009 à 14:55
0
Merci
Oui tu as raison j'ai oublié de te préciser qu'il faut que je soit compatible php 4.3.8
Beaucoup de contrainte je sais ^_^
Commenter la réponse de cs_Valentino
syndrael 2382 Messages postés lundi 4 février 2002Date d'inscription 29 décembre 2012 Dernière intervention - 1 sept. 2009 à 16:20
0
Merci
Voila à quoi servent les nouvelles versions.. compléter des besoins, dans le cas présent un besoin de tri.
Au delà de ça, je dirai qu'une structure de donnée doit être construire autour de son utilisation. Le langage objet peut servir à créer des 'conteneurs' et les manipuler plus aisément.
C'était la minute philosophique du jour.
S.
Commenter la réponse de syndrael
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 1 sept. 2009 à 17:29
0
Merci
D'accord pour la réponse Syndrael, cependant en ce qui me concerne les maj sont malheureusement impossible, nous avons un parc de serveur sur lesquels des problèmes de dépendance persistent... il va falloir que je fasse avec.
Commenter la réponse de cs_Valentino
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 2 sept. 2009 à 10:06
0
Merci
Rendre le code compatible php4 doit être largement faisable... Essai déjà :

var $sorted = array();

dans la classe à la place de

var $sorted;

Ou alors fais en sorte de ne pas renvoyer un objet mais un tableau...


_________________________________
Min iPomme
Commenter la réponse de Tonio_35
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 2 sept. 2009 à 11:06
0
Merci
Bonjour Tonio_35,

Le typage de $sorted n'est pas nécéssaire puisque quoi qu'il arrive c'est un array...
foreach($objects->sorted as $pays) n'est pas possible car $pays est déjà un tableau.
Je tente avec un for et sizeof.
Commenter la réponse de cs_Valentino
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 2 sept. 2009 à 14:14
0
Merci
Ba nan t'as ca créer un nouveau tableau :

foreach($objects->sorted as $paysnew)

_________________________________
Min iPomme
Commenter la réponse de Tonio_35
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 2 sept. 2009 à 14:42
0
Merci
L'erreur est :

Warning: Invalid argument supplied for foreach() in /home/httpd/html/test.php on line 16
Array ( )


Si je fais un var_dump($objects->sorted); il me retourne bool(false)


Donc $sample->$property n'est pas set...
Commenter la réponse de cs_Valentino
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 2 sept. 2009 à 15:46
0
Merci
T'as bien fais un :

$objects = new ObjSorter($pays,3, "ASC");

avant le :

foreach($objects->sorted as $pays)

Sinon renvois ton code... la ou tu en es...
_________________________________
Min iPomme
Commenter la réponse de Tonio_35
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 2 sept. 2009 à 16:18
0
Merci
Oui je l'ai fais... un bon vieux c/c
Commenter la réponse de cs_Valentino
cs_Valentino 81 Messages postés vendredi 19 juillet 2002Date d'inscription 3 août 2010 Dernière intervention - 2 sept. 2009 à 18:24
0
Merci
C'est parfait Bemale !
C'est ce que j'avais tenté de faire avant de faire le post sur CS sans succès...

Merci à vous 2 et CS.
Commenter la réponse de cs_Valentino
Tonio_35 567 Messages postés mercredi 4 octobre 2006Date d'inscription 30 août 2011 Dernière intervention - 2 sept. 2009 à 18:33
0
Merci
Aïe aïe aïe, merci à Bemale, je me coucherais moins ©0~...

J'ai jamais aimé les fonction de tri sur les tableaux...

_________________________________
Min iPomme
Commenter la réponse de Tonio_35

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.