sandrinoo Posté 23 Juillet 2013 Posté 23 Juillet 2013 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 117A 5B 45B 12 Merci pour la personne qui voudrait bien m'aider sandy
SFTA26700 Posté 23 Juillet 2013 Posté 23 Juillet 2013 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
sandrinoo Posté 23 Juillet 2013 Auteur Posté 23 Juillet 2013 Oui seb, merci de m'avoir répondue, c'est exactement cela. Comment il faut que je fasse ?
SStephane Posté 23 Juillet 2013 Posté 23 Juillet 2013 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,${ 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);
sandrinoo Posté 23 Juillet 2013 Auteur Posté 23 Juillet 2013 Merci SStephane ! Je vais l'adapter à mon code pour le tester...
sandrinoo Posté 23 Juillet 2013 Auteur Posté 23 Juillet 2013 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
SFTA26700 Posté 23 Juillet 2013 Posté 23 Juillet 2013 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 ?
SStephane Posté 23 Juillet 2013 Posté 23 Juillet 2013 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
sandrinoo Posté 24 Juillet 2013 Auteur Posté 24 Juillet 2013 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
SFTA26700 Posté 24 Juillet 2013 Posté 24 Juillet 2013 (modifié) 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é 24 Juillet 2013 par SFTA26700
sandrinoo Posté 24 Juillet 2013 Auteur Posté 24 Juillet 2013 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 ?
SFTA26700 Posté 24 Juillet 2013 Posté 24 Juillet 2013 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; }
sandrinoo Posté 24 Juillet 2013 Auteur Posté 24 Juillet 2013 (modifié) 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é 24 Juillet 2013 par sandrinoo
SFTA26700 Posté 24 Juillet 2013 Posté 24 Juillet 2013 Merci surtout a SStephane et son code de dingue
sandrinoo Posté 26 Juillet 2013 Auteur Posté 26 Juillet 2013 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,${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');
SStephane Posté 26 Juillet 2013 Posté 26 Juillet 2013 <?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,${ 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);
sandrinoo Posté 26 Juillet 2013 Auteur Posté 26 Juillet 2013 Encore une fois bravo SStephane. Et merci ! Plein de bonnes choses pour ce week-end !
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant