problème de tableau

Mammouth du PHP | 536 Messages

10 août 2007, 09:26

ce que je veux faire en fait, c'est mettre dans mon tableau tous mes utilisateurs et leur id mais qu'une seule fois, ils ne doivent pas etre présent plusieurs fois.
J'ai fais ainsi, mais sans succès :
<?
$arrayUsId = array();
for ($i=0; $i<$practiceOn->length; $i++) {
    $usId = $practiceOn->item($i)->getAttribute('usId');
    $user = $xpUsers->query('//user[@id="'.$usId.'"]');
    $nameUser = $user->item(0)->getAttribute('name');
    $firstnameUser = $user->item(0)->getAttribute('firstname');
    $existe_deja = false;
    foreach($arrayUsId as $utilisateur){
      if( $utilisateur['usId'] == $usId ){
        $existe_deja = true;
        break; 
      }
      else {
      $arrayUsId['usId'] = $usId;
      $arrayUsId['name'] = $nameUser;
      $arrayUsId['firstname'] = $firstnameUser;
      }
    } 
    //if ( in_array($usId, $arrayUsId) ) continue;
    //$arrayUsId['usId'] = $usId;
    //$arrayUsId['name'] = $nameUser;
    //$arrayUsId['firstname'] = $firstnameUser;
}
echo "<pre>"; print_r($arrayUsId); echo "</pre>";
?>
Qu'est-ce qui cloche ?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

d0m
Mammouth du PHP | 1141 Messages

10 août 2007, 09:53

le problème vient de l'emplacement de ton ajout de l'utilisateur. Avec ce code :
 foreach($arrayUsId as $utilisateur){ //parcours du tableau des utilisateurs
      if( $utilisateur['usId'] == $usId ){ //si l'utilisateur est celui dont l'id est $usId
        $existe_deja = true; 
        break;  
      } 
      else { //si l'utilisateur n'est pas celui dont l'id est $usId
      $arrayUsId['usId'] = $usId; 
      $arrayUsId['name'] = $nameUser; 
      $arrayUsId['firstname'] = $firstnameUser; 
      } 
    }  
tu ajoutes un utilisateur dans ton tableau à chaque fois que l'utilisateur que tu testes dans le tableau n'est pas celui que tu cherches.
Par exemple avec 3 utilisateurs dans le tableau:
tu vas regarder si le 1er est celui qui a la bonne id... non alors tu ajoutes un nouveau avec l'id.
tu vas regarder si le 2e est celui qui a la bonne id... non alors tu ajoutes un nouveau avec l'id.
...
tu le rajoutes autant de fois que tu ne le trouves pas. c'est pas bon

la bonne méthode est une fois ton tableau $arrayUsId parcouru (sorti du foreach), tu vérifies si existe_deja est à true. Si c'est le cas tu ne le rajoutes pas puisqu'il existe déjà. Sinon tu le rajoutes.


Une autre méthode pour être sur de n'avoir qu'une seule occurence de l'utilisateur est de mettre en clé son $us_id dans le tableau $arrayUsId.
De cette manière si tu ajoutes un utilisateur qui existe déjà, il va juste écraser l'ancien
ex :
tab_prenom = array();
//on ajoute beka
tab_prenom[$id_beka] = 'beka';
//on ajoute d0m
tab_prenom[$id_d0m]  = 'd0m';
//on ajoute à nouveau beka
tab_prenom[$id_beka] = 'beka';

le tableau ne contiendra que beka et d0m

Mammouth du PHP | 536 Messages

10 août 2007, 10:02

je suis largué...

du coup je suis parti sur autre chose. Je laisse mon tableau avec tous les utilisateurs. Et c'est à l'affichage de ceux-ci que je vais faire un test avec un nouveau tableau à une dimension

Je fais ainsi, mais là, toujours un probl-ème, j'en ai qu'un seul qui s'affiche.
<?
$i=0;
foreach ($arrayUsId as $key=>$Value){
if ( $i == 3) { break; }
else {
  $usId = $Value['usId'];
  $firstname = $Value['firstname'];
  $name = $Value['name'];
  $user = array();
  $user['name'] = $name;
  //print_r($user); 
  if ( in_array($name, $user) ) continue;
  echo $name." ".$firstname." - ";
  }
  $i++;}?>
Modifié en dernier par béka le 10 août 2007, 10:21, modifié 1 fois.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

d0m
Mammouth du PHP | 1141 Messages

10 août 2007, 10:21

je suis largué...
dans un tableau tu as 2 choses : la clé et le contenu de la case.
$tableau[$cle] = $contenu;
pour une clé(ou index) correspond donc une seule valeur.

si tu mets l'id d'un élement en clé, on ne peut associer à cette clé qu'un seul contenu.
Dans ton cas le contenu d'une "case" est

Code : Tout sélectionner

$us_id $element = array( 'us_id' => $us_id, 'nameUser' => 'toto', 'firstNameUser' => 'titi')
en mettant l' us_id en tant que clé :
$arrayUsId[$us_id] = $element;
cela permet en cas d'ajout du même utilisateur plusieurs fois de l'avoir qu'une seule fois dans le tableau, sans avoir à tester si il existe déjà.

par exemple si tu as un casier avec plusieurs emplacements, un emplacement pour chaque sorte de fruit avec son nom au dessus (pomme, poire,...) et un sac de fruits
tu tires dans le sac une banane tu la place dans son emplacement, puis une pomme, puis une poire, puis un ananas et là tu tire de nouveau une pomme. Comme il n'y a qu'un seul emplacement par fruit et que tu veux avoir qu'une seule fois le même fruit tu vas la mettre à la place de l'autre pomme.

C'est le même principe. La clé correspond au numéro de l'emplacement du casier.

Mammouth du PHP | 536 Messages

10 août 2007, 10:26

d'accord ok, j'ai pigé.

Ainsi en faisant cela :
<?
$arrayUsId = array();
for ($i=0; $i<$practiceOn->length; $i++) {
    $usId = $practiceOn->item($i)->getAttribute('usId');
    $idPractice = $practiceOn->item($i)->getAttribute('id');
          $thePracticeFile = $cfg['ressources_root'].'/content/practice/'.$idPractice.'.xml';
          $domThePracticeFile = new DOMDocument('1.0','UTF-8');
          $domThePracticeFile->load($thePracticeFile);
          $xpThePracticeFile = new DOMXPath($domThePracticeFile);
          $date_created = $xpThePracticeFile->query('//item[@id="'.$idPractice.'"]')->item(0)->getAttribute('date_created');
          
    $user = $xpUsers->query('//user[@id="'.$usId.'"]');
    $nameUser = $user->item(0)->getAttribute('name');
    $firstnameUser = $user->item(0)->getAttribute('firstname');
    $existe_deja = false;
    $arrayUsId[$usId]['usId'] = $usId;
    $arrayUsId[$usId]['name'] = $nameUser;
    $arrayUsId[$usId]['firstname'] = $firstnameUser;
    $arrayUsId[$usId]['date_created'] = $date_created;
}
echo "<pre>"; print_r($arrayUsId); echo "</pre>"; >
je n'ai qu'une seule fois mon utilisateur dans mon tableau

Ensuite je tri mon tableau par date pour avoir le plus récent en haut de cette manière :
<?
foreach ($arrayUsId as $key => $row) {
    $tab_idUser[$key]         = $row['usId']; 
    $tab_nameUser[$key]       = $row['name'];
    $tab_firstnameUser[$key]  = $row['firstname'];
    $tab_dateCreated[$key]    = $row['date_created'];
}

array_multisort($tab_dateCreated, SORT_DESC, $arrayUsId ); 
?>

et plus tard dans mon développement, je les affiche ainsi (que les 3 derniers):
<?
$i=0;
foreach ($arrayUsId as $key=>$Value){
if ( $i == 3) { break; }
else {
 $usId = $Value['usId'];
$firstname = $Value['firstname'];
$name = $Value['name'];
echo $name." ".$firstname." - ";
}
  $i++;
}?>
Merci en tout.
Bon je garde l'adresse de ce sujet dans mes favoris.. lol
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

d0m
Mammouth du PHP | 1141 Messages

10 août 2007, 10:39

attention lors de ton tri, une fois les 4 tableaux constitué tu dois les ranger dans un autre tableau :
<? 
$tab = array('idUsers' => $tab_idUser,
              'nameUsers' => $tab_nameUser,
              'firstnameUsers' => $tab_firstnameUser
              'datesCreated' => $tab_dateCreated);

array_multisort($tab['dateCreated'], SORT_DESC, $tab); 
?>
Si tu ne veux pas passer par ce tableau intermédiaire, tu peux utiliser la fonction usort pour directement trier le tableau $arrayUsId selon ta propre fonction de tri qui consisterai à comparer les dates.

Mammouth du PHP | 536 Messages

10 août 2007, 10:43

mon tri s'effectue correctement sans repasser par un nouveaux tableau..
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!