Problème de tableaux imbriqués

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de tableaux imbriqués

Re: Problème de tableaux imbriqués

par Skw33d » 18 mai 2011, 13:43

Derien au fait je viens de voir une petite erreur : c'est pas
if(!isset($userInfo[$user['nom']])){
mais
if(!isset($userInfo[$user['ID_User']])){
J'ai édité dans mon post aussi. L'erreur en elle même ne gêne pas mais ça vient à chaque fois remettre les valeurs déjà défini dans le tableau donc d'un point de vue performance je pense pas que c'est très optimale.

Re: Problème de tableaux imbriqués

par Zeppo » 18 mai 2011, 11:49

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

Re: Problème de tableaux imbriqués

par Skw33d » 17 mai 2011, 12:11

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

par Zeppo » 16 mai 2011, 12:10

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

par Skw33d » 16 mai 2011, 10:29

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

par Zeppo » 16 mai 2011, 10:09

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

par Skw33d » 15 mai 2011, 11:07

Est ce que ton problème est résolu ? Si oui merci de le marquer comme tel ;)

Re: Problème de tableaux imbriqués

par Zeppo » 15 mai 2011, 09:27

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

par devlop78 » 14 mai 2011, 04:05

Euuuh ...
if($statut = 'TECH') {
C'est normal l'opérateur d'affectation ?

Re: Problème de tableaux imbriqués

par Skw33d » 13 mai 2011, 14:39

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

par macgawel » 13 mai 2011, 10:44

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

par Zeppo » 13 mai 2011, 10:16

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

par Skw33d » 12 mai 2011, 20:10

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

par Zeppo » 12 mai 2011, 19:49

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

par Skw33d » 12 mai 2011, 19:41

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.