Aller au contenu

Trier variables sur les 2 derniers chiffres


Sujets conseillés

Posté

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.

Posté

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?

Posté

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.

Posté

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.

Posté

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.

Posté (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 ?


<?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
Posté

ç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 :)

Posté

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.

Posté

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

Posté

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

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

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...