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

Signaler
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010
-
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
-
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

Messages postés
24
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
11 septembre 2009

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)
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
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
        )

)
*/
?>
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
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
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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).
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
MmmmMmmm...

Php version 5 ?


_________________________________
Min iPomme
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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 ^_^
Messages postés
2380
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
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.
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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.
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
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
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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.
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
Ba nan t'as ca créer un nouveau tableau :

foreach($objects->sorted as $paysnew)

_________________________________
Min iPomme
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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...
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
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
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

Oui je l'ai fais... un bon vieux c/c
Messages postés
81
Date d'inscription
vendredi 19 juillet 2002
Statut
Membre
Dernière intervention
3 août 2010

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.
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
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