Page 1 sur 1

Trier un Array un peu particulier

Posté : 14 oct. 2011, 22:14
par krapoul
Bonjour,
Merci d'avance pour votre aide.

J'ai une variable $varinput recuperée d'un INPUT du genre.

|9|15|11|14|18|11|

Je cherche a separer les données et les trier (croissant) sous la forme le nombre et son classement en variable.

$nombre[1] =9
$classement[1] = 1
$nombre[2] =11
$classement[2] = 3
$nombre[3] = 11
$classement[3] = 6
$nombre[4] =14
$classement[4] = 4
$nombre[5] =15
$classement[5] = 2
$nombre[6] =18
$classement[6] = 5

Ces variables doivent me servir pour de la mise en page.

Avant de m'insulter j'ai tout essayé, regardé sous GOGOLE mais rien
J'ai utilisé les fonctions :
$attributs = explode('|', $varinput, -1);
$compteur=1;
foreach($varinput as $key => $val)

Voilà le bout de script qui ne trie rien :
$compteur=1;
 
foreach($varinput as $key => $val)
 
{
 
$nombre[$compteur]=$val;
 
 
$classement[$compteur] = $compteur;
 
$nombre[$compteur] = ceil($nombre[$compteur]);
 
echo " -> Le nombre ".ceil($nombre[$compteur])." a le classement  " . $classement[$compteur]. "  dans la liste<br/>";
 
$compteur++;
 
}
J'ai besion d'un petit coup de pouce.
Merci d'avance.

Re: Trier un Array un peu particulier

Posté : 14 oct. 2011, 23:21
par xTG
J'ai essayé cela :
$input = '|9|15|11|14|18|11|';
$input[0] = '';
$input[strlen($input) - 1] = '';
$tab = explode('|',$input);
$tab_trie = array();
foreach($tab as $key => $val)
	$tab_trie[$val] = $key + 1;
ksort($tab_trie);
echo'<pre>';print_r($tab_trie);echo'</pre>';
Array
(
[9] => 1
[11] => 6
[11] => 3
[14] => 4
[15] => 2
[18] => 5
)
Je me suis même aperçu que ça semble fonctionner avec les deux 11...
Certes on peut pas accéder directement à la valeur qu'on souhaite car la clé est la même, mais il conserve tout de même les deux valeurs. 8-|

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 00:09
par krapoul
Re,
Merci pour ta reponse mais j'ai deux questions ...

1 - Pourquoi lorsque je rentre |5,7|15|9,3|10|13|4,6|21|8,4|41|24|35|5,7|

j'obtiens

Array
(
[5,7] => 1
[4,6] => 6
[5,7] => 12
[8,4] => 8
[9,3] => 3
[10] => 4
[13] => 5
[15] => 2
[21] => 7
[24] => 10
[35] => 11
[41] => 9
)

le 1er et le troisième sont identiques mais classés 1er et 3ème alors qu'il devraient être 2ème et 3ème. :shock: :shock:

2 - comment modifier ton script pour les nombres et le classement en variable ou en session.

merci vraiment merci d'avance.

Cdlt

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 00:36
par krapoul
Re,
Merci pour ta reponse mais j'ai deux questions ...

1 - Pourquoi lorsque je rentre |5,7|15|9,3|10|13|4,6|21|8,4|41|24|35|5,7|

j'obtiens

Array
(
[5,7] => 1
[4,6] => 6
[5,7] => 12
[8,4] => 8
[9,3] => 3
[10] => 4
[13] => 5
[15] => 2
[21] => 7
[24] => 10
[35] => 11
[41] => 9
)

le 1er et le troisième sont identiques mais classés 1er et 3ème alors qu'il devraient être 2ème et 3ème. :shock: :shock:

2 - comment modifier ton script pour mettre les nombres et le classement en variable ou en session.

merci vraiment merci d'avance.

Cdlt

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 07:11
par soycd
Ton problème est que le séparateur de décimal anglais est le . pas la ,

Ensuite le second problème est que tu ne peux faire ça dans un simple tableau, car tes clefs seront forcément écrasées s'il y a doublon dans ton tableau, que ce soit en mettant les valeurs ou les positions en clefs.

Donc soit 2 tableaux, soit un tableau à 2 dimensions.

Exemple avec 2 dimensions
$input = '|5,7|15|9,3|10|13|4,6|21|8,4|41|24|35|5,7|';
$input = str_replace(',', '.', trim($input, '|'));
$tab = explode('|', $input);

sort($tab);

$tabTri = array();
$previous = null;
$pos = 1;
foreach( $tab as $k => $value )
{
    if( $previous !== null && $previous !== $value )
        $pos++;
    $previous = $value;
    $tabTri[$k]['value'] = $value;
    $tabTri[$k]['position'] = $pos;
}


echo'<pre>';print_r($tabTri);echo'</pre>';
comment modifier ton script pour mettre les nombres et le classement en variable ou en session.
Pas compris.

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 09:20
par krapoul
Bonjour et merci pour ta réponse

C'est parfait - Cela fonctionne mais... :lol:

Le classement doit se faire a partir de la liste initiale et pas de finale.

D'apres to bout de code j'ai :
Array
(
[0] => Array
(
[value] => 4.6
[position] => 1
)

[1] => Array
(
[value] => 5.7
[position] => 2
)

[2] => Array
(
[value] => 5.7
[position] => 2
)

[3] => Array
(
[value] => 8.4
[position] => 3
)

[4] => Array
(
[value] => 9.3
[position] => 4
)

[5] => Array
(
[value] => 10
[position] => 5
)

[6] => Array
(
[value] => 13
[position] => 6
)

[7] => Array
(
[value] => 15
[position] => 7
)

[8] => Array
(
[value] => 21
[position] => 8
)

[9] => Array
(
[value] => 24
[position] => 9
)

[10] => Array
(
[value] => 35
[position] => 10
)

[11] => Array
(
[value] => 41
[position] => 11
)

)


Alors que pour le premier (exemple) le bon résultat est

Array
(
[0] => Array
(
[value] => 4.6
[position] => 6
)

car dans la liste il est placé $input = '|5,7|15|9,3|10|13|4,6|21|8,4|41|24|35|5,7|';

merci pour ton aide

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 09:34
par xTG
Ensuite le second problème est que tu ne peux faire ça dans un simple tableau, car tes clefs seront forcément écrasées s'il y a doublon dans ton tableau, que ce soit en mettant les valeurs ou les positions en clefs.
De nature réveillée je plussoie, cependant j'avoue que je comprend pas le fonctionnement de PHP avec mon script.
Ce que j'ai quoté est bien ce qu'il m'affiche et on un résultat tapé main, donc on peut voir qu'il n'a pas écrasé la clé 11 mais qu'il en a créé une seconde. :|

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 10:25
par soycd
Bonjour et merci pour ta réponse

C'est parfait - Cela fonctionne mais... :lol:

Le classement doit se faire a partir de la liste initiale et pas de finale.
Donc en fait, ce n'est pas un classement en fonction d'un ordre numérique ascendant, mais seulement sa position dans la liste que tu veux ?

Si c'est ça,
position valeur dans la liste = sa clef + 1
cependant j'avoue que je comprend pas le fonctionnement de PHP avec mon script.
Ce que j'ai quoté est bien ce qu'il m'affiche et on un résultat tapé main, donc on peut voir qu'il n'a pas écrasé la clé 11 mais qu'il en a créé une seconde. :|
Cela vient de
$input[0] = '';
$input[strlen($input) - 1] = '';
Tu remplaces le 1er et dernier caractère par null.
Comportement bizarre, mais sûrement dû au typage faible de php.

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 10:30
par krapoul
Re,

Si

il y a deux etapes

je veux qu'il garde en memoire son classement initial ds la liste
et après qu'il trie les données par odre croissant
Pour un affichage

Array
(
[4.6] => 6 // 4.6 est le nombre plus petit (donc le premier de la liste) avec un positionnement initial (dans la liste de départ) en 6 ème position
[5.7] => 1
[5.7] => 12
[8.4] => 8
[9.3] => 7
[10] => 4
[13] => 5
[15] => 2
[24] => 10
[35] => 11
[41] => 9
)

merci bcp pour ton aide

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 10:55
par soycd
Ah ok, avec une copie du tableau initial et un array_search, ça devrait le faire.
$input = '|5,7|15|9,3|10|13|4,6|21|8,4|41|24|35|5,7|';
$input = str_replace(',', '.', trim($input, '|'));
$tab = explode('|', $input);
$tabCopy = $tab;
sort($tab);

$tabTri = array();
$previous = null;
$pos = 1;
foreach( $tab as $value )
{
    if( $previous !== null && $previous !== $value )
        $pos++;
    $posList = array_search($value, $tabCopy);
    unset($tabCopy[$posList]);
    $previous = $value;
    $tabTri[$posList+1]['value'] = $value;
    $tabTri[$posList+1]['position'] = $pos;
}

ksort($tabTri);           

echo'<pre>';print_r($tabTri);echo'</pre>';
Donc les clefs de l'array sont la position des éléments dans la liste de départ.

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 14:38
par sirakawa
peut-être:
<?PHP
//en retirant le premier |
$donnees= "5,7|15|9,3|10|13|4,6|21|8,4|41|24|35|5,7|";

$t_donnees = explode( "|", $donnees);
$nb = count ($t_donnees);
print "$nb <br>";
$combine = array();
for ($i = 0; $i <$nb; $i++)
{
	$combine [$i]['origine'] = $i+1;
	$combine [$i]['valeur'] = $t_donnees[$i];	
}

sort ($combine, SORT_STRING);
print_r($combine);
?>

Re: Trier un Array un peu particulier

Posté : 15 oct. 2011, 16:11
par krapoul
bonjour
Merci pour votre aide

ton bout de code fonctionne a merveille mais juste une chose

Code : Tout sélectionner

<? $input = '|5,7|15|9,3|10|13|4,6|21|8,4|41|24|35|5,7|'; $input = str_replace(',', '.', trim($input, '|')); $tab = explode('|', $input); $tabCopy = $tab; sort($tab); $tabTri = array(); $previous = null; $pos = 1; foreach( $tab as $value ) { if( $previous !== null ) $pos++; $posList = array_search($value, $tabCopy); unset($tabCopy[$posList]); $previous = $value; $tabTri[$posList+1]['value'] = $value; $tabTri[$posList+1]['position'] = $pos; $_SESSION['nombre'.$pos] = $tabTri[$posList+1]['value']; } ksort($tabTri); echo'<pre>';print_r($tabTri);echo'</pre>'; ?>
Voila le resultat :

Array
(
[1] => Array
(
[value] => 5.7
[position] => 2
)

................... etc .........................


[11] => Array
(
[value] => 35
[position] => 10
)

[12] => Array
(
[value] => 5.7
[position] => 3
)

)


Comment recuperer dans une variable le chiffre qui se trouve en gras dans le resultat

comme ds le code j'ai

$_SESSION['nombre'.$pos] = $tabTri[$posList+1]['value'];

je veux egalement la recuperer sous la forme

$_SESSION['classement'.$pos] = ICI RECUPERATION DU CHIFFRE

Merci d'avance