Jump to content
Sign in to follow this  
sandrinoo

Trier variables sur les 2 derniers chiffres

Rate this topic

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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Edited by sandrinoo

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Edited by sandrinoo

Share this post


Link to post
Share on other 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 ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...