Tri array sur une colonne non nommé

Résolu
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010 - 1 sept. 2009 à 11:25
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 - 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.

17 réponses

Bemale Messages postés 24 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 11 septembre 2009
2 sept. 2009 à 17:59
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)
3
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
1 sept. 2009 à 13:35
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
        )

)
*/
?>
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
1 sept. 2009 à 13:51
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
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
1 sept. 2009 à 14:06
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).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
1 sept. 2009 à 14:23
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
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
1 sept. 2009 à 14:29
MmmmMmmm...

Php version 5 ?


_________________________________
Min iPomme
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
1 sept. 2009 à 14:55
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 ^_^
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
1 sept. 2009 à 16:20
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.
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
1 sept. 2009 à 17:29
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.
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
2 sept. 2009 à 10:06
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
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
2 sept. 2009 à 11:06
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.
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
2 sept. 2009 à 14:14
Ba nan t'as ca créer un nouveau tableau :

foreach($objects->sorted as $paysnew)

_________________________________
Min iPomme
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
2 sept. 2009 à 14:42
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...
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
2 sept. 2009 à 15:46
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
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
2 sept. 2009 à 16:18
Oui je l'ai fais... un bon vieux c/c
0
cs_Valentino Messages postés 81 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 3 août 2010
2 sept. 2009 à 18:24
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.
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
2 sept. 2009 à 18:33
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
0
Rejoignez-nous