Fusion de tableaux multidimensions en fonction d'une clé [Résolu]

Signaler
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
25 août 2005
-
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
25 août 2005
-
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

Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
25 août 2005

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.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
moi je pensais à un foreach puis un sort...

vas sur php.net et cherches array
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
25 août 2005

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
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
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???"
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
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.
Messages postés
5
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
25 août 2005

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
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
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???"