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 -
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 :
Et ce que je veux c'est ça :
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.
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:
- Combiner deux tableaux
- Fusionner deux tableaux excel - Guide
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Excel combiner deux cellules - Guide
- Nombre de jours entre deux dates excel - Guide
8 réponses
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 à :
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
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.
Pourriez-vous m'aider ?
merci d'avance.
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) :
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.
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(Et idem avec le second tableau.
[CodePersonne] => [0] => NomPersonne,
[1] => TypeContratPersonne
),
[CodePersonne2] => [0] => NomPersonne2,
[1] => TypeContratPersonne2
),
[CodePersonne3] => [0] => NomPersonne3,
[1] => TypeContratPersonne3
),
);
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.
Donc il faudrait que je fasse comme ceci
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu compliques trop !
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...
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...
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>";
?>
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>";
?>
Amusant, ton test :
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.
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.
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>";
$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>";
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>";
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>";