Combiner deux tableaux

Résolu/Fermé
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016 - 22 nov. 2013 à 11:36
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 - 22 nov. 2013 à 16:34
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.
A voir également:

8 réponses

Utilisateur anonyme
22 nov. 2013 à 14:06
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 lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
22 nov. 2013 à 14:19
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
22 nov. 2013 à 14:41
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 lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
22 nov. 2013 à 15:06
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
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 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
Modifié par Super_carotte le 22/11/2013 à 16:14
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
22 nov. 2013 à 16:22
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 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
Modifié par Super_carotte le 22/11/2013 à 16:30
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 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
22 nov. 2013 à 16:34
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