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

nikoo3 5 Messages postés jeudi 20 mars 2003Date d'inscription 25 août 2005 Dernière intervention - 25 août 2005 à 19:53 - Dernière réponse : nikoo3 5 Messages postés jeudi 20 mars 2003Date d'inscription 25 août 2005 Dernière intervention
- 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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
nikoo3 5 Messages postés jeudi 20 mars 2003Date d'inscription 25 août 2005 Dernière intervention - 26 août 2005 à 16:33
3
Merci
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.

Merci nikoo3 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 78 internautes ce mois-ci

Commenter la réponse de nikoo3
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 25 août 2005 à 20:10
0
Merci
moi je pensais à un foreach puis un sort...

vas sur php.net et cherches array
Commenter la réponse de coucou747
nikoo3 5 Messages postés jeudi 20 mars 2003Date d'inscription 25 août 2005 Dernière intervention - 25 août 2005 à 20:36
0
Merci
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
Commenter la réponse de nikoo3
coockiesch 2268 Messages postés mercredi 27 novembre 2002Date d'inscription 13 septembre 2013 Dernière intervention - 25 août 2005 à 20:46
0
Merci
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???"
Commenter la réponse de coockiesch
J_G 1406 Messages postés mercredi 17 août 2005Date d'inscription 28 août 2007 Dernière intervention - 25 août 2005 à 20:56
0
Merci
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.
Commenter la réponse de J_G
nikoo3 5 Messages postés jeudi 20 mars 2003Date d'inscription 25 août 2005 Dernière intervention - 25 août 2005 à 22:58
0
Merci
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
Commenter la réponse de nikoo3
coockiesch 2268 Messages postés mercredi 27 novembre 2002Date d'inscription 13 septembre 2013 Dernière intervention - 25 août 2005 à 23:42
0
Merci
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???"
Commenter la réponse de coockiesch

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.