Page 1 sur 2

Problème de tableaux imbriqués

Posté : 12 mai 2011, 17:45
par Zeppo
Bonjour à toutes et tous,

je vous expose mon problème en espérant que vous pourrez m'aider

Je récupère des valeurs à partir d'un Web Service
donc je fais une boucle for classique.
for($i=0 ; $i<$resulset ; $i++)
{
   $ID_user = $ID_User[$i];
   $nom = $nom[$i];
   $prenom = $prenom[$i];
   $statut = $statut[$i];
   $fonction = $fonction[$i];

// ensuite je construis un tableau en fonction du statut
if($statut == 'TECH') {
$userTech[] = $nom.'  '.$prenom.'  '.$statut.'  '.$fonction;
}
elseif($statut == 'ADM') {
$userAdm[] = $nom.'  '.$prenom.'  '.$statut.'  '.$fonction;
}

}

// et j'affiche mes lignes
foreach($userTech as $valueUserTech) (
echo $valueUserTech.'<br>';
}
foreach($userAdm as $valueUserAdm) (
echo $valueUserAdm.'<br>';
}

j'ai résumé pour ne pas mettre trop d'info.
jusqu'à là pas de souci,

La BDD d'où sont issues les informations a ce format

ID_USER, NOM, PRENOM, STATUT, FONCTION

exemple :
12345, TOTO, TATA, TECH, CHEF
12345, TOTO, TATA, TECH, PATRON
12345, TOTO, TATA, TECH, MECANICIEN

23456, TATA, TOTO, ADM, STENO
23456, TATA, TOTO, ADM, DACTYLO
23456, TATA, TOTO, ADM, SECRETAIRE


etc..

chaque utilisateur à un ID qui lui est propre bien sur, mais la seule variable qui soit unique pour un utilisateur est la FONCTION, et c'est bien là mon problème.

je souhaiterai supprimer les doublons ID_USER, NOM, PRENOM, STATUT et afficher les fonctions pour chaque utilisateur

exemple
(USER 1)
12345, TOTO, TATA, TECH,
CHEF
PATRON
MECANICIEN

(USER 2)
23456, TATA, TOTO, ADM
STENO
DACTYLO
SECRETAIRE


je suppose que c'est faisable en passant par des tableaux imbriqués, mais là je sèche litérallement

merci de votre aide

Re: Problème de tableaux imbriqués

Posté : 12 mai 2011, 19:41
par Skw33d
Peut-être qu'une restructuration de la base de données serait plus propre.

Par exemple, au lieu d'avoir une table comme tu as actuellement :
ID_USER, NOM, PRENOM, STATUT, FONCTION

Tu pourrais avoir deux tables :

[USERS] avec les champs suivants :
id_user, nom_user, prenom_user, statut_user

[FONCTION_USERS] avec les champs suivants :
id_user, fonction_user

Puis pour ta requête, une petite jointure :

SELECT nom_user, prenom_user, statut_user, fonction_user JOIN fonction_users ON users.id_user = fonction_users.id_user

Plusieurs avantages à cette méthode :

- Allégement de la base de données
- Optimisation de la requête (beaucoup moins de données à récupérer, parce que avec plusieurs user qui ont plusieurs fonctions, ça fait beaucoup...)
- Évite un traitement PHP

Voilà ! Comme tu dis, ce doit être faisable par tableaux imbriqués mais je te propose vraiment d'opter pour cette solution qui te facilitera bien du code PHP et des requêtes beaucoup plus optimisées.

Re: Problème de tableaux imbriqués

Posté : 12 mai 2011, 19:49
par Zeppo
Merci pour ta réponse mais je ne peux pas accéder, et encore moins modifier la structure de cette BDD, je dois impérativement jongler avec une autre solution...
je récupère les informations via un Web Service qui interroge une procédure stockée, et même cette procédure ne m'est pas accessible.

Re: Problème de tableaux imbriqués

Posté : 12 mai 2011, 20:10
par Skw33d

Code : Tout sélectionner

<?php $bdd = connectBDD(); //Connexion DB $req = $bdd->prepare('SELECT * FROM users'); $req->execute(); $data = $req->fetchAll(PDO::FETCH_ASSOC); foreach($data as $user){ if(!isset($userInfo[$user['nom']])){ $userInfo[$user['nom']]['nom'] = $user['nom']; $userInfo[$user['nom']]['prenom'] = $user['prenom']; } $userInfo[$user['nom']]['fonction'][] = $user['fonction']; } echo '<pre>'; print_r($userInfo); echo '</pre>'; ?>
Voila, j'ai testé ça, est ce que c'est ce que tu recherches ? J'ai oublié de mettre le statut, mais tu as juste à le rajouter. J'ai testé, ça marche. Pour la requête j'utilise PDO, mais adapte la à ton fonctionnement.

Re: Problème de tableaux imbriqués

Posté : 13 mai 2011, 10:16
par Zeppo
Salut Skw33d,

Déjà merci de t'être penché sur mon souci, mais non ce n'est pas ce que je recherche.

je souhaiterai avoir une seule ligne par utilisateur, et toutes les Fonctions de cet utilisateur.

Re: Problème de tableaux imbriqués

Posté : 13 mai 2011, 10:44
par macgawel
Il "suffit" de faire un SELECT * sur ta table, trié sur l'utilisateur, et de faire le traitement en PHP en comparant les ID...

Exemple (foireux, c'est juste pour expliciter le principe, hein).
// $users est le tableau qui récupère le SELECT
// On initialise la variable de comparaison
$cmp_id = '';
foreach ($users as $user) {
   if ( $user[id_user] == $cmp_id ) {
      echo $user[fonction];
   }
   else {
      echo "$user[id_user], $user[nom], $user[prenom], $user[statut];
      $cmp_id = $user[id);
   }
}

Re: Problème de tableaux imbriqués

Posté : 13 mai 2011, 14:39
par Skw33d
C'est vrai qu'en relisant ton problème il n'était pas forcement nécessaire d'utiliser des tableaux. Mais on va dire que le titre m' à fait pensé à cette solution.
Donc la solution de macgawel convient parfaitement.

Re: Problème de tableaux imbriqués

Posté : 14 mai 2011, 04:05
par devlop78
Euuuh ...
if($statut = 'TECH') {
C'est normal l'opérateur d'affectation ?

Re: Problème de tableaux imbriqués

Posté : 15 mai 2011, 09:27
par Zeppo
oupsss désolé

c'est pas un opérateur d'affectation mais un opérateur de comparaison...
Erreur de frappe :?

c'est corrigé

Re: Problème de tableaux imbriqués

Posté : 15 mai 2011, 11:07
par Skw33d
Est ce que ton problème est résolu ? Si oui merci de le marquer comme tel ;)

Re: Problème de tableaux imbriqués

Posté : 16 mai 2011, 10:09
par Zeppo
Salut,

non mon problème n'est toujours pas résolu... je continu à chercher les solutions proposées ne fonctionnent pas :(

Re: Problème de tableaux imbriqués

Posté : 16 mai 2011, 10:29
par Skw33d
Les codes proposés ne fonctionnent pas ? Peux tu nous envoyer ton code actuel ?
Le résultat de l’exécution de code ? Il y a une erreur ? ou le résultat n'est pas celui correspondant à tes attentes ?

Re: Problème de tableaux imbriqués

Posté : 16 mai 2011, 12:10
par Zeppo
Je mets la totalité de mon code..
<?php
$codeInterv = $_POST['CodStructure'];
ini_set('soap.wsdl_cache_enabled', 0);
try {
      $sWSDL = '**********************/**/**?wsdl';
      $oClient = new SoapClient($sWSDL, array('trace' => 1, 'soap_version'=> SOAP_1_1));
	  $aParamPerso = array('codeIntervStruct' => $codeInterv, 
                 // valeurs retournées
                 'persoStruct' => array(
				 'codeIntervenant',
				 'civilite',
				 'nom',
				 'prenom',
				 'statut',
				 'codeSpecialitePersonnel')
        );
		
        $reponsePerso = $oClient->getPersoStruct($aParamPerso);
		$totalPerso = count($reponsePerso->persoStruct);
				

 for($i=0;$i <$totalPerso;$i++) {
	 
	 // Affichage avec mise en forme de la réponse
	$ID_User			= $reponsePerso->persoStruct[$i]->codeIntervenant;
	$civilite 			= $reponsePerso->persoStruct[$i]->civilite; 
	$nom				= $reponsePerso->persoStruct[$i]->nom;
	$prenom				= $reponsePerso->persoStruct[$i]->prenom;
	$statut				= $reponsePerso->persoStruct[$i]->statut;
	$fonction			= $reponsePerso->persoStruct[$i]->codeSpecialitePersonnel;
	
	if($statut == 'TECH') {
	$FonctionTECH = 'Technicien<br />';
	$TECH[] = $ID_User.' '.$civilite.' '.$prenom.' '.$nom.' '.$statut.' '.$fonction;
	}
	
	elseif($statut == 'ADM') {
	$FonctionADM = 'Administratif<br />';
	$ADM[] = $ID_User.' '.$civilite.' '.$prenom.' '.$nom.' '.$statut.' '.$fonction;
	}
	
}
	echo $FonctionTECH;
	foreach($TECH as $valueTECH) {
	echo $valueTECH.'<br>';
	}
	
	// Va me donner comme résultat
        // Technicien
	// 12345 M TOTO TATA TECH MECANICIEN
	// 12345 M TOTO TATA TECH RESPONSABLE
	// 12345 M TOTO TATA TECH CHEF
	// 52412 M LALA COCO TECH MECANICIEN
	// ETC.
	
	// Ce que je souhaite
         // Technicien
	// 12345 M TOTO TATA TECH MECANICIEN RESPONSABLE CHEF
	// 52412 M LALA COCO TECH MECANICIEN
	
	echo $FonctionADM;
	foreach($ADM as $valueADM) {
	echo $valueADM.'<br>';
	}
	
	// Va me donner comme résultat
        // Administratif
	// 45678 MME TATA TOT0 ADM SECRETAIRE
	// 45678 MME TATA TOT0 ADM STENO
	// 45678 MME TATA TOT0 ADM DACTYLO
	// 45678 MME TATA TOT0 ADM STANDARDISTE
	// 78954 MLLE TITI COCO ADM GESTIONNAIRE
	// 78954 MLLE TITI COCO ADM SECRETAIRE
	// ETC.
	
	// Ce que je souhaite
        // Administratif
	// 45678 MME TATA TOT0 ADM SECRETAIRE STENO DACTYLO STANDARDISTE
	// 78954 MLLE TITI COCO ADM GESTIONNAIRE SECRETAIRE
	
} 
catch(SoapFault $exception) {
      echo '<b>Une exception s\'est produite :</b><br/>'.$exception->faultstring;
}

?>

Re: Problème de tableaux imbriqués

Posté : 17 mai 2011, 12:11
par Skw33d
Voila ce que je peux te proposer. C'est fonctionnel, mais ça peut être largement optimisé je pense donc après à toi de jouer.

 
<?php   
    $statut = array();
    foreach($data as $user){
        if(!in_array($user['statut'],$statut)){
            $statut[] = $user['statut'];
        }
        if(!isset($userInfo[$user['ID_User']])){
            $userInfo[$user['ID_User']]['nom'] = $user['nom'];
            $userInfo[$user['ID_User']]['prenom'] = $user['prenom'];
            $userInfo[$user['ID_User']]['statut'] = $user['statut'];
        }
            $userInfo[$user['ID_User']]['fonction'][] = $user['fonction'];     
    }
    
    foreach($statut as $statut){
        echo "$statut<br />";
        foreach($userInfo as $key => $user){
            if($user['statut'] == $statut){
                echo $key.' ';
                echo $user['nom'].' ';
                echo $user['prenom'].' ';
                foreach($user['fonction'] as $fonction){
                    echo $fonction.' ';
                }
                echo '<br />';
            }
        }
        echo '<br />';
    }
?>

Re: Problème de tableaux imbriqués

Posté : 18 mai 2011, 11:49
par Zeppo
Super Skw33d !!!
c'est exactement ce que je souhaitais, tu m'enlèves une énorme épine du pied...

bonne journée, et en espérant qu'un jour je puisse aussi te dépanner. :D