Aller au contenu
sandrinoo

Trier variables sur les 2 derniers chiffres

Noter ce sujet :

Recommended Posts

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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?

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :


<?php
function sort_delegate($a, $B)
{
$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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?


<?php
function 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é par sandrinoo

Partager ce message


Lien à poster
Partager sur d’autres sites

ça peut en effet paraître étrange, mais en fait ça ne l'est pas smile.gif

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 :

<?php

function sort_delegate($a, $B)
{
$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 :)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par sandrinoo

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;)

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

×