Fusion de tableaux multidimensions en fonction d'une clé

Résolu
nikoo3 Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 25 août 2005 - 25 août 2005 à 19:53
nikoo3 Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 25 août 2005 - 26 août 2005 à 16:33
Salut à tous, j'ai un problème en PHP que je n'arrive pas à résoudre:
j'ai deux tableaux séprarés qui ont 5 dimensions, dont une qui est une date.
Je dois fusionner ces deux tableaux, par date croissante, pour ensuite afficher l'unique tableau résultat.
Je n'y arrive pas. J'ai tenté de me servir da la fonction array_multisort, mais sans succès...
Quelqu'un peut il m'aider?

Merci beaucoup.

PS: si ce que je dis n'a pas été clair, n'hésitez pas à m'écrire à nicube à free.fr

7 réponses

nikoo3 Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 25 août 2005
26 août 2005 à 16:33
Ca n' rien donné de mieux avec les timestamp.
Je suis passé par un tri à bulle :
<?php
function DateToNumber($a)
{
return mb_strcut ($a ,6 ,4).mb_strcut ($a ,3 ,2).mb_strcut ($a ,0 ,2);
}
function NumberToDate($a)
{
return mb_strcut ($a ,6 ,2)."/".mb_strcut ($a ,4 ,2)."/".mb_strcut ($a ,0 ,4);
}

function Tri_A_Bulle ($Tab, $NbElem)
{


$k = $NbElem;
while ($k > 1)
{
for ($i = 0; $i < ($NbElem - 1); $i++)
{
echo "
".$i .": ".$Tab[$i][1];


echo "
";echo $i+1;echo ": "; echo $Tab[$i+1][1];
echo "
";
//$i--;
if ($Tab[$i][1] > $Tab [$i+1][1])
{
//Permuter ($Tab[$i], $Tab[$i + 1]);
$Tmp = $Tab[$i];

$Tab[$i]=$Tab[$i+1];
$Tab[$i+1]= $Tmp;

}

}
$k--;
}
return $Tab;
}


function DateToNumber($a)
{

$chaine = substr ($a ,6 ,4).substr ($a ,3 ,2).substr ($a ,0 ,2);
return $chaine;
}
function NumberToDate($a)
{
return substr ($a ,6 ,2)."/".substr ($a ,4 ,2)."/".substr ($a ,0 ,4);
}


$donnees = array( array( 'NICO', DateToNumber('22/01/2005') ),
array( 'JULIE', DateToNumber('01/01/2005') ), array( 'MARC', DateToNumber('06/01/2005') ),
array( 'JEAN', DateToNumber('23/01/2005') ) );
foreach( $donnees as $value )
echo $value[0] . ' ' . $value[1] . '
';


echo '
';


$donnees = Tri_A_Bulle( $donnees,sizeof($donnees));
foreach( $donnees as $value )
echo $value[0] . ' ' . NumberToDate($value[1] ). '
';
?>

Ca pourra toujours servir a quelqu'un...
Cependant cette solution est tres lourde, et je conseille a ceux qui ont de gros tableaux de passer par un autre tri.
Merci en tout cas de vos réponse.
Nico.
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
25 août 2005 à 20:10
moi je pensais à un foreach puis un sort...

vas sur php.net et cherches array
0
nikoo3 Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 25 août 2005
25 août 2005 à 20:36
Je vais peut être préciser en fait ce que je cherche :

Comment trier un tableau multidimension en fonction d'une des colones ?
EX : classement d'un tableau a deux dimension en fonction de la date
NICO 22/10/2005 JEAN 23/01/2005
JULIE 01/07/2005 ==> MARC 06/05/2005
MARC 06/05/2005 JULIE 01/07/2005
JEAN 23/01/2005 NICO 22/10/2005

Je pense que ca doit être faisable en appelant une fonction. Faire une boucle rend la complexité de l'algo énorme.

Merci encore
0
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
25 août 2005 à 20:46
Pour trier, tu devrais regarder: http://www.nexen.net/docs/php/annotee/function.uksort.php


Je viens de faire:

function compare( $a, $b )

{

if( $a[1] == $b[1] )

return 0;



return ( $a[1] > $b[1] ) ? -1 : 1;

}



$donnees = array( array( 'NICO', '22/10/2005' ), array( 'JULIE',
'01/07/2005' ), array( 'MARC', '06/05/2005' ), array( 'JEAN',
'23/01/2005' ) );

foreach( $donnees as $value )

echo $value[0] . ' ' . $value[1] . '
';



echo '
';



uksort( $donnees, "compare" );

foreach( $donnees as $value )

echo $value[0] . ' ' . $value[1] . '
';



Et ca affiche:

NICO 22/10/2005

JULIE 01/07/2005

MARC 06/05/2005

JEAN 23/01/2005



JEAN 23/01/2005

MARC 06/05/2005

JULIE 01/07/2005

NICO 22/10/2005



@++



R@f


www.allpotes.ch: Photos, humour, vidéos, gags, ...

"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 9
25 août 2005 à 20:56
Salut, ceciammène cela :




<hr size="2" width="100%">
array_multisort




(PHP 4, PHP 5)

array_multisort -- Tri multi-dimensionnel de tableaux




Description
bool array_multisort ( array ar1 [,
mixed arg [, mixed ... [, array ...]]] )


Cette fonction retourne <tt>TRUE</tt> en cas de succès,
<tt>FALSE</tt> en cas d'échec.


array_multisort() sert à trier simultanément plusieurs
tableaux, ou bien à trier un tableau multi-dimensionnel, suivant l'une ou
l'autre de ses dimensions.
0
nikoo3 Messages postés 5 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 25 août 2005
25 août 2005 à 22:58
Merci pour ton aide 18466 coockiesch , mais la solution ne marche pas

En effet, pour l'exemple donné ca fonctionne, mais en implémentant la solution j'ai eu des problèmes...
Si tu prends le code suivant

<?php
function compare( $a, $b )
{
if( $a[1] == $b[1] )
return 0;


return ( $a[1] > $b[1] ) ? -1 : 1;
}


$donnees = array( array( 'NICO', '22/01/2005' ), array( 'JULIE', '01/01/2005' ), array( 'MARC', '06/01/2005', ), array( 'JEAN', '23/01/2005' ) );
foreach( $donnees as $value )
echo $value[0] . ' ' . $value[1] . '
';


echo '
';


uksort( $donnees, "compare" );
foreach( $donnees as $value )
echo $value[0] . ' ' . $value[1] . '
';
?>

(Le meme avec des dates dans le meme mois)

le résultat n'est pas bon:

NICO 22/01/2005
JULIE 01/01/2005
MARC 06/01/2005
JEAN 23/01/2005

JEAN 23/01/2005
MARC 06/01/2005
JULIE 01/01/2005
NICO 22/01/2005

et je ne sais pas trop pourquoi...

Je suis donc toujours sans solution...
Merci de votre aide
0
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
25 août 2005 à 23:42
Salut!

Il doit prendre ca comme des chaînes de caractères, faudrait utiliser
des timestamp. TU peux aps générer les timestamp des dates avant de
classer tout ca?



@++



R@f

www.allpotes.ch: Photos, humour, vidéos, gags, ...

"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
0
Rejoignez-nous