Aller au contenu
sandrinoo

Classement resultat d'un tableau

Noter ce sujet :

Recommended Posts

Bonjour à toutes et à tous.

Je suis énervée car depuis hier soir sur ce truc, et je n'y arrive pas (Php n'étant pas mon fort).

Voilà, J'ai un tableau de ce style :

Array (
[0] => Array ( [0] => 117 [1] => A )
[1] => Array ( [0] => 12 [1] => B )
[2] => Array ( [0] => 45 [1] => B )
[3] => Array ( [0] => 5 [1] => A )
)


J'aimerai trier ce tableau pour classer les résultats suivant :
- ordre alpabetique des data[1]
- puis décroissant numerique des data[0]

En fait comme ceci :

A 117
A 5
B 45
B 12

Merci pour la personne qui voudrait bien m'aider

sandy

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

il te faut un tableau resultat ? comme ca ?

Array (
[0] => Array ( [0] => 117 [1] => A)
[1] => Array ( [0] => 5 [1] => A )
[2] => Array ( [0] => 45 [1] => B )
[3] => Array ( [0] => 12 [1] => B )
)

Seb

Partager ce message


Lien à poster
Partager sur d’autres sites

usort :http://php.net/manual/fr/function.usort.php



<?php

$arr = array(
array(117,'A'),
array(12,'B'),
array(45,'B'),
array(5,'A'),

);

function my_comp($a,$B){
if($a[1]===$b[1]){
if($a[0]===$b[0]) return 0;
return ($a[0]>$b[0])? -1 : 1;
}
return ($a[1]>$b[1])? 1 : -1;
}
usort($arr, 'my_comp');
var_dump($arr);

Partager ce message


Lien à poster
Partager sur d’autres sites

SStephane chapeau !

Je suis incapable actuellement de pondre un code comme ça.

Mais ton code fonctionne pour ce tableau de depart :

$arr = array(
array(117,'A'),
array(12,'B'),
array(45,'B'),
array(5,'A'),

);

mais pas pour le mien qui est présenté de cette façon :

$arr = Array (
[0] => Array ( [0] => 117 [1] => A )
[1] => Array ( [0] => 12 [1] => B )
[2] => Array ( [0] => 45 [1] => B )
[3] => Array ( [0] => 5 [1] => A )
)

et qui dois finir exactement comme cela :

$arr = Array (
[0] => Array ( [0] => 117 [1] => A )

[1] => Array ( [0] => 5 [1] => A )

[2] => Array ( [0] => 45 [1] => B )
[3] => Array ( [0] => 12 [1] => B )
)

Je doute que j'y arrive seule

Partager ce message


Lien à poster
Partager sur d’autres sites

pourtant :

$arr = array(
array(117,'A'),
array(12,'B'),
array(45,'B'),
array(5,'A'),

);

est l'équivalent au tien .

celui la :

$arr = Array (
[0] => Array ( [0] => 117 [1] => A )
[1] => Array ( [0] => 12 [1] => B )
[2] => Array ( [0] => 45 [1] => B )
[3] => Array ( [0] => 5 [1] => A )
)

ca ressemble plus à un resultat d'un print_r ou d'un truc comme ca

on peut voir le bout de code avant ?, comment est construit $arr ?

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est effectivement une réplique du tableau que tu présentes, s'il est différent, ça ne fonctionnera pas, poste le nous, il suffit d'arranger la fonction déléguée au tri


Partager ce message


Lien à poster
Partager sur d’autres sites

Désolée de ne pas vous avoir répondu plus tôt SStephane et SFTA26700 :


en tout cas, un grand merci de vous intéresser à mon cas.



Voici le code :



foreach($go->item as $item)
{$tab[] = array((string)$item['product'],(string)$item->color,(string)$item->label;}

echo '<pre>';
print_r($tab);
echo '</pre>';

en fait les chiffres c'est $item['product'] et les lettres A,B c'est $item->label

Partager ce message


Lien à poster
Partager sur d’autres sites

y a pas un truc louche ?

ca me rappelle un test PHP sur le site de SStephane

pourquoi dans chaque case de $tab tu as que 2 valeurs dans ton tableau resultat

$arr = Array (
[0] => Array ( [0] => 117 [1] => A )
[1] => Array ( [0] => 12 [1] => B )
[2] => Array ( [0] => 45 [1] => B )
[3] => Array ( [0] => 5 [1] => A )
)

alors que tu en insert 3

array((string)$item['product'],(string)$item->color,(string)$item->label;

d'ailleurs attention, il manque une paranthese fermante à la fin

et donc quand tu utilises la fonctione de SStephane apres ca fonctionne pas ?

foreach($go->item as $item)
{$tab[] = array((string)$item['product'],(string)$item->color,(string)$item->label);} //avec la paranthese qui manque

usort($tab, 'my_comp');

print_r($tab);

ca donne quoi ? un message d'erreur?

on peut voir l'objet $go aussi?

seb

Modifié par SFTA26700

Partager ce message


Lien à poster
Partager sur d’autres sites

1/ c'est normal, j'avais simplifié le code pour mieux comprendre (j'avais supprimé l'item color)

En fait le vrai code résultant de la print_r($tab) est :

Array (
[0] => Array ( [0] => 117 [1] => green [2] => A )
[1] => Array ( [0] => 12 [1] => green [2] => B )
[2] => Array ( [0] => 45 [1] => red [2] => B )
[3] => Array ( [0] => 5 [1] => yellow [2] => A )
)

2/ Pas de souci pour la parenthèse c'est une erreur de recopie pour mon post

3/ en fait il n'y a pas de message d'erreur

En fait ça à l'air de marcher, mais comme je vous ai donné un code simplifié avec 2 items à la place de 3items, et bien ca m'effectue le classement sur le 1er et le 2 eme item alors que je voudrais le classement sur le 1er et le 3eme item (je ne suis pas sûre d'être très clair...)

comment changer alors le code que vous m'avez fait ?

Partager ce message


Lien à poster
Partager sur d’autres sites

hmmm je dirais :



function my_comp($a,${
if($a[2]===$b[2]){
if($a[0]===$b[0]) return 0;
return ($a[0]>$b[0])? -1 : 1;
}
return ($a[2]>$b[2])? 1 : -1;
}

Partager ce message


Lien à poster
Partager sur d’autres sites

J'adore ! Merci le code marche ! J'aurais pas été capable de l'écrire.



Maintenant que c'est fait, ça à l'air simple : je me pencherais dessus ce soir après le boulot pour bien le comprendre.



Un grand merci à SStephane et SFTA26700.



Webmaster-hub est mon site de prédilection quand j'ai vraiment besoin d'aide en php (après plusieurs heures de recherche personnelle infructueuse) !



Merci encore.



PS : pour info, est-ce cela une "comparaison de types en php" ? Est-ce le terme utilisé pour que j'effectue une recherche ?


Modifié par sandrinoo

Partager ce message


Lien à poster
Partager sur d’autres sites

Désolée, mais je me permet de revenir pour compliquer un peu la chose.

Soit mon array comme ceci :

Array ([0] => Array ( [0] => 117 [1] => green [2] => A )[1] => Array ( [0] => 12 [1] => green [2] => B )[2] => Array ( [0] => 45 [1] =>  red        [2] => B )[3] => Array ( [0] => 5 [1] => yellow [2] => A )[4] => Array ( [0] => 78 [1] =>  red        [2] => A ))

J'aimerai ajouter une 3eme condition au code que vous avez réalisé à savoir :

Trier array :

1. en priorité si valeur couleur est red $a[1]

2. puis sur la lettre ordre alphabétique $a[2] (déjà codé)

3. puis sur le nombre décroissant $a[0] (déjà codé)

En fait que le tableau trié donne cela :

[4] => Array ( [0] => 78 [1] => red [2] => A )[2] => Array ( [0] => 45 [1] => red [2] => B )[0] => Array ( [0] => 117 [1] => green [2] => A )[3] => Array ( [0] => 5 [1] => yellow [2] => A )[1] => Array ( [0] => 12 [1] => green [2] => B )

J'ai essayé de tester des codes de ce style sans résultat :

function my_comp($a,$B)
{if($a[1]=== 'red'])
{if($a[2]===$b[2]) return 0;return ($a[2]<$b[2])? -1 : 1;}
{if($a[0]===$b[0]) return 0;return ($a[0]>$b[0])? -1 : 1;}
return ($a[1]>$b[1])? 1 : -1;}
usort($arr, 'my_comp');

Partager ce message


Lien à poster
Partager sur d’autres sites

<?php

$arr = array (

array( 117 ,'green', 'A' ),

array( 12 ,'green', 'B' ),

array( 45 ,'red', 'B' ),

array( 5 ,'yellow', 'A' ),

array( 78 ,'red', 'A' ),

);

function my_comp($a,$B){

if($a[1]=== 'red' XOR $b[1]=== 'red'){

return ($a[1]==='red')? -1 : 1;

}

if($a[2]===$b[2]){

if($a[0]===$b[0]) return 0;

return ($a[0]>$b[0])? -1 : 1;

}

return ($a[2]>$b[2])? 1 : -1;

}

usort($arr, 'my_comp');

var_dump($arr);

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×