sandrinoo Posté 4 Septembre 2012 Posté 4 Septembre 2012 Bonjour à toutes et à tous, J'ai besoin de classer ces variables en ordre croissant suivant les 2 derniers chiffres d'une chaine : $row[1] = 'glslsjihcehidh12';$row[2] = 'glslsjihcehidh07';$row[3] = 'glslsjihcehidh99';$row[4] = 'glslsjihcehidh03'; Pour cela, je fais un : sort($row, SORT_NUMERIC);foreach($row as $row){echo $row;} Mais cela ne fonctionne pas. Auriez-vous des solutions ? Peut-être avec une fonction Sort() spéciale ou avec un substr($row,-2) ? Mais je ne parviens pas à l'intégrer... Merci d'avance si quelqu'un se penchait sur mon problème... Sandy.
captain_torche Posté 4 Septembre 2012 Posté 4 Septembre 2012 Un simple asort($row), sans second paramètre, semble fonctionner à la perfection.
sandrinoo Posté 4 Septembre 2012 Auteur Posté 4 Septembre 2012 Merci Danacol de m'avoir répondu mais moi cela ne fonctionne pas de mon côté. Je suis allé un peu vite : en fait mes variables sont plutôt comme ceci : $row[1] = 'adfridh12';$row[2] = 'hj-ytr9dcehidh07';$row[3] = 'dfgbce_hidh99';$row[4] = 'bfc-e6hidh03'; C'est-à-dire avec des chaînes de lettres différentes et certaines ont même des chiffres à l'intérieur. Avec asort() ca les classe suivant la premère lettre. Il me faut donc les classer obligatoirement je pense suivant les 2 derniers chiffres, non?
SStephane Posté 4 Septembre 2012 Posté 4 Septembre 2012 Oui pas le choix, et tu devras certainement utiliser un delegué (callable en PHP) pour effectuer une fonction de tri personnalisée. Un truc de ce style : <?phpfunction sort_delegate($a, ${$first = (int) substr( $a, strlen( $a ) - 2 );$second = (int) substr( $b, strlen( $b ) - 2 ); return ($first > $second);}$row = array();$row[] = 'glsqsdqsdlsjihcehidh12';$row[] = 'xcvglslsjihcehidh07';$row[] = 'glslsjihyuicehidh99';$row[] = 'ertglslsjgjhgihcehidh03';usort($row, "sort_delegate");var_dump($row); à toi de compléter cette fonction selon ton usage.
SStephane Posté 4 Septembre 2012 Posté 4 Septembre 2012 Et pour info, SORT_NUMERIC ne peut fonctionner car les entrées du tableau sont transtypées en int et toutes tes valeurs seront = 0 : var_dump( (int) "glslsjihcehidh12" ); natsort s'approche de tes besoins, mais ne fonctionnera pas AMHA.
sandrinoo Posté 4 Septembre 2012 Auteur Posté 4 Septembre 2012 Merci beaucoup Sstephane, ton code fonctionne ! C'est ce que je cherchais : une fonction intégrant substr mais pas assez calée en php (et en délégué/callable php que je découvre) Et exact : natsort() que j'avais essayée ne fonctionnait pas non plus, merci encore et bonne soirée. Sandy.
sandrinoo Posté 10 Septembre 2012 Auteur Posté 10 Septembre 2012 (modifié) Bizarre, le script de SStephane fonctionne avec 2 chiffres finaux dans les variables, et jusqu'à 10 finaux dans les variables mais à partir de 11 il ne classe plus les variables correctement ? <?phpfunction sort_delegate($a, ${$first = (int) substr( $a, strlen( $a ) - 11 );$second = (int) substr( $b, strlen( $b ) - 11 ); return ($first > $second);}$row = array();$row[] = 'glsqsdqsdlsjihcehidh122554235842';$row[] = 'xcvglslsjihcehidh26584563258';$row[] = 'glslsjihyuicehidh25448546854';$row[] = 'ertglslsjgjhgihcehidh022541254125';usort($row, "sort_delegate"); Ce script modifié pour des variables à 11 chiffres ne fonctionne plus... Quelqu'un(e) a une idée ? Sandy Modifié 10 Septembre 2012 par sandrinoo
SStephane Posté 11 Septembre 2012 Posté 11 Septembre 2012 ça peut en effet paraître étrange, mais en fait ça ne l'est pas Même si PHP n'est pas un langage à typage fort, tu remarques que je transtype en (int) ces lignes : (int) substr( $a, strlen( $a ) - 11 ) Le type int a une limite qui correspond en général à 32 bits signés (environ 2 milliards), le script suivant te donne la valeur exacte au delà de laquelle le tri ne fonctionnera plus : print (PHP_INT_MAX); Tu peux éventuellement transtyper en float, selon ton envirronement, ça devrait fonctionner : <?phpfunction sort_delegate($a, ${$first = (float) substr( $a, strlen( $a ) - 11 );$second = (float) substr( $b, strlen( $b ) - 11 );return ($first > $second);}$row = array();$row[] = 'glsqsdqsdlsjihcehidh122554235842';$row[] = 'xcvglslsjihcehidh26584563258';$row[] = 'glslsjihyuicehidh25448546854';$row[] = 'ertglslsjgjhgihcehidh022541254125';usort($row, "sort_delegate");var_dump($row); PS : Si float ne suffit pas non plus, enlève purement en simplement le transtypage, je me demande quand même quel type de script peut bien t'amener à faire ça
sandrinoo Posté 11 Septembre 2012 Auteur Posté 11 Septembre 2012 Oui, merci une seconde fois Sstephane ! Ca marche... J'aurais pu m'en douter : on trouve ces 'INT' dans les bases de données. Mais bon j'apprends toute seule le PHP et c'est pas toujours évident... En fait dans mon script il y a 14 chiffres correspondant à la date et à l'heure pour un classement temporel. On doit sûrement pas s'y prendre comme je le fais mais bon, je suis consciente que mes scripts sont un peu "bidouillés". Merci encore. Sandy.
Dadou Posté 11 Septembre 2012 Posté 11 Septembre 2012 Tu aurais pus utiliser le timestamp, ou mettre le chiffre en debut plutôt qu'a la fin, moi c'est ce que je fais : 2012-09-11-15-38-22-nom-document, du coup le tri alpha fonctionne
SStephane Posté 11 Septembre 2012 Posté 11 Septembre 2012 Si tu fais l'extraction d'un résultat de requête, le mieux est en effet de stocker un datetime avec le date/heure dans la table concernée, et de faire un simple ORDER BY
sandrinoo Posté 11 Septembre 2012 Auteur Posté 11 Septembre 2012 (modifié) Oui merci Dadou j'avais pensé à cela mais il me fallait le nombre en bout de chaine. Et SSteph merci aussi, mais je ne voulais pas compliquer et solliciter encore ma base de données... La soluce actuelle me convient parfaitement. Merci encore à tous les 2. Bonne soirée. Modifié 11 Septembre 2012 par sandrinoo
SStephane Posté 11 Septembre 2012 Posté 11 Septembre 2012 Un champ datetime pèse 8 octets, n'hésites surtout pas à solliciter ta base d'autant qu'elle est faite pour ça (optimisation du stockage, sélection/classement etc.). Mais content que la solution te convienne
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant