Combiner deux tableaux

Résolu
Coutcout86 Messages postés 195 Date d'inscription   Statut Membre Dernière intervention   -  
Super_carotte Messages postés 1420 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai un petit soucis pour combiner deux tableaux qui proviennent de deux requête différentes. Pour explication, j'ai une premiere requête permettant de récupérer les informations des personnes (Nom,CodePersonnel, Prenom etc...) sur une période précise et une deuxième requête permettant de récupérer un nombre d'heure sur différentes type d'actions(CodePersonne, nbh_tpc, nbh_abs).

Ce que j'ai c'est ça :


Array(
[0]=> Array( [0] => CodePersonne,
[1] => NomPersonne,
[2]=> TypeContratPersonne

),
[1]=> Array( [0] => CodePersonne2,
[1] => NomPersonne2,
[2]=> TypeContratPersonne2

),
[2]=> Array( [0] => CodePersonne3,
[1] => NomPersonne3,
[2]=> TypeContratPersonne3

),
);


Array(
[0]=> Array( [0] => CodePersonne,
[1] => Nb_heure_tpc,
[2]=> Nb_heure_abs

),
[1]=> Array( [0] => CodePersonne2,
[1] => Nb_heure_tpc2,
[2]=> Nb_heure_abs2

),
[2]=> Array( [0] => CodePersonne3,
[1] => Nb_heure_tpc3,
[2]=> Nb_heure_abs3

),

[3]=> Array( [0] => CodePersonne4,
[1] => Nb_heure_tpc4,
[2]=> Nb_heure_abs4

),

);

Et ce que je veux c'est ça :


Array(
[0]=> Array([0] => CodePersonne,
[1] => NomPersonne,
[2] => PrenomPersonne,
[3] => Nb_heure_tpc,
[4]=> Nb_heure_abs

),
[1]=> Array( [0] => CodePersonne2,
[1] => NomPersonne2,
[2] => PrenomPersonne2,
[3] => Nb_heure_tpc2,
[4]=> Nb_heure_abs2

),
[2]=> Array( [0] => CodePersonne3,
[1] => NomPersonne3,
[2] => PrenomPersonne3,
[3] => Nb_heure_tpc3,
[4]=> Nb_heure_abs3

)

);

La requête d'UNION ne marche pas étant donné que dans mon SELECT je n'ai pas le même nombre d'éléments donc j'aurais aimé savoir comment on aurais pu faire en PHP ?

Pourriez-vous m'aider?

Merci d'avance.
Romain COUTINEAU.

8 réponses

Utilisateur anonyme
 
Bonjour

Il ne faut pas faire ça en PHP mais directement en SQL grâce à une jointure.
Je ne connais pas le nom précis de tes tables, mais ça pourrait ressembler à :
SELECT p.CodePersonne, p.NomPersonne, p.PrenomPersonne, h.Nb_heure_tpc, h.Nb_heure_abs FROM personnes p INNER JOIN heures h ON p.CodePersonne=h.CodePersonne
0
Coutcout86 Messages postés 195 Date d'inscription   Statut Membre Dernière intervention  
 
Pour répondre à ta question dans mes requêtes, il y a déjà des jointures (LEFT JOIN ... ON ) mais le problème c'est que mes deux requêtes ont des WHERE différents (les dates sont différentes). Et en fonction de ses résultats j'aimerais coupler pour mettre les informations dans un seul et meme tableau.

Pourriez-vous m'aider ?

merci d'avance.
0
Utilisateur anonyme
 
Il y aurait un tas de manières.
L'une des plus simples demande que tu modifies un peu la création de tes tableaux, pour obtenir (ce qui est plus logique, d'ailleurs) :
Array(
[CodePersonne] => [0] => NomPersonne,
[1] => TypeContratPersonne

),
[CodePersonne2] => [0] => NomPersonne2,
[1] => TypeContratPersonne2

),
[CodePersonne3] => [0] => NomPersonne3,
[1] => TypeContratPersonne3

),
);
Et idem avec le second tableau.

Ensuite, tu boucles sur le premier tableau en testant avec un simple isset() si l'élément de même indice existe dans le second.
0
Coutcout86 Messages postés 195 Date d'inscription   Statut Membre Dernière intervention  
 
Donc il faudrait que je fasse comme ceci

Foreach($array1 as $codePersonnel => $personne){
foreach($array2 as $codePersonnel2 => $secondtableau){
if(!isset($codePersonnel2){

}
}
}

Le problème c'est que je ne sais pas quoi mettre dans mon isset je comprends pas trop la démarche pourrais-tu m'expliquer ?


merci d'avance.
0

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

Posez votre question
Utilisateur anonyme
 
Tu compliques trop !

Foreach($array1 as $codePersonnel=>$personne){
if(!isset($array2[$codePersonnel]){
echo $codePersonnel, $personne[0],$personne[1],array2[$codePersonnel][0],array2[$codePersonnel][1];
}
}

La démarche te semble-t-elle plus claire ou veux-tu d'autres explications ?
Je te rappelle qu'il faut D'ABORD que tu modifies la façon dont tu crées tes tableaux pour mettre le codePersonnel en indice au lieu de laisser les indices "naturels" 0,1,2...
0
Super_carotte Messages postés 1420 Date d'inscription   Statut Membre Dernière intervention   127
 
Par rapport a l'exemple mis plus haut, voici un code très sale mais qui marche.

Attention, ça pique les yeux ^^ c'est du quick and dirty...

<?php
// TES DEUX TABLEAUX EXEMPLES
$tab1=Array(
0=> Array( 0 => "CodePersonne",
1 => "NomPersonne",
2=> "TypeContratPersonne"

),
1=> Array( 0 => "CodePersonne2",
1 => "NomPersonne2",
2=> "TypeContratPersonne2"

),
2=> Array( 0 => "CodePersonne3",
1 => "NomPersonne3",
2=> "TypeContratPersonne3"

)
);


$tab2=Array(
0=> Array( 0 => "CodePersonne",
1 => "Nb_heure_tpc",
2=> "Nb_heure_abs"

),
1=> Array( 0 => "CodePersonne2",
1 => "Nb_heure_tpc2",
2=> "Nb_heure_abs2"

),
2=> Array( 0 => "CodePersonne3",
1 => "Nb_heure_tpc3",
2=> "Nb_heure_abs3"

)
);


// LE CODE
echo "<pre>";
echo "avant:";
print_r($tab1);
echo "</pre>";

$i=0;
foreach($tab1 as $cle=>$value){
if($tab1[$i][0]==$tab1[$i][0]){
$tab1[$i][3]=$tab1[$i][1];
$tab1[$i][4]=$tab1[$i][2];
}
$i++;
}
echo "<pre>";
echo "apres:";
print_r($tab1);
echo "</pre>";
?>
0
Utilisateur anonyme
 
Amusant, ton test :
if($tab1[$i][0]==$tab1[$i][0]){ 

Bon, ok, tu voulais mettre $tab2 à l'un de deux. Mais même comme ça, ça ne marche pas parce que tu ne compares que les éléments de même indice dans les deux tableaux, alors qu'on peut trouver la même personne à deux indices différents dans les deux tableaux.
Pour rester dans ton esprit, il faudrait deux boucles imbriquées.
0
Super_carotte Messages postés 1420 Date d'inscription   Statut Membre Dernière intervention   127
 
Bon, voila la V2:
$tab1=Array(
0=> Array( 0 => "CodePersonne",
1 => "NomPersonne",
2=> "TypeContratPersonne"

),
1=> Array( 0 => "CodePersonne2",
1 => "NomPersonne2",
2=> "TypeContratPersonne2"

),
2=> Array( 0 => "CodePersonne3",
1 => "NomPersonne3",
2=> "TypeContratPersonne3"

)
);


$tab2=Array(
0=> Array( 0 => "CodePersonne",
1 => "Nb_heure_tpc",
2=> "Nb_heure_abs"

),
1=> Array( 0 => "CodePersonne2",
1 => "Nb_heure_tpc2",
2=> "Nb_heure_abs2"

),
2=> Array( 0 => "CodePersonne3",
1 => "Nb_heure_tpc3",
2=> "Nb_heure_abs3"

)
);



echo "<pre>";
echo "avant:";
print_r($tab1);
echo "</pre>";

foreach($tab1 as $cle_tab1=>$value_tab1){
foreach($tab2 as $cle_tab2=>$value_tab2){
if($tab1[$cle_tab1][0]==$tab2[$cle_tab2][0]){
array_push($tab1[$cle_tab1], $tab2[$cle_tab2][1]);
array_push($tab1[$cle_tab1], $tab2[$cle_tab2][2]);
}
}
}
echo "<pre>";
echo "apres:";
print_r($tab1);
echo "</pre>";
0
Super_carotte Messages postés 1420 Date d'inscription   Statut Membre Dernière intervention   127
 
La v3 qui gere si il y a plusieurs fois la meme personne dans le tableau 2:
echo "<pre>";
echo "avant:";
print_r($tab1);
echo "</pre>";


foreach($tab1 as $cle_tab1=>$value_tab1){
foreach($tab2 as $cle_tab2=>$value_tab2){
if($tab1[$cle_tab1][0]==$tab2[$cle_tab2][0]){
if(isset($tab1[$cle_tab1][3])){ // cas ou il y a deja une valeure
$tab1[$cle_tab1][3] += $tab2[$cle_tab2][1];
$tab1[$cle_tab1][4] += $tab2[$cle_tab2][2];
}else{
array_push($tab1[$cle_tab1], $tab2[$cle_tab2][1]);
array_push($tab1[$cle_tab1], $tab2[$cle_tab2][2]);
}
}
}
}
echo "<pre>";
echo "apres:";
print_r($tab1);
echo "</pre>";
0