problème de tableau

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 tableau

par béka » 10 août 2007, 10:43

mon tri s'effectue correctement sans repasser par un nouveaux tableau..

par d0m » 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.

par béka » 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

par d0m » 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.

par béka » 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++;}?>

par d0m » 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

par béka » 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 ?

par d0m » 10 août 2007, 09:21

et ce code que tu proposes est à placer où ?
Tout dépend de ce que tu veux faire.
Si tu veux modifier par exemple les données de l'élement que tu cherches, tu mettras du code après le if, etc.
Là c'est juste la recherche de l'élement pour le reste tu devrais t'en tirer.

par béka » 10 août 2007, 09:07

et ce code que tu propose d0m est à placer où ?

par d0m » 10 août 2007, 08:24

pas de in_array dans ce cas puisque conceptuellement tu ne va pas vraiment vérifier si la variable est dans le tableau mais plutôt si la variable est la valeur d'un champ spécifique d'un élement.
Pour imager c'est comme si tu cherchais une paire de chaussures et que tu n'as pas une liste de chaussure mais une liste de personnes à qui il faut demander si elles portent ces chaussures.

ça serait donc un truc du genre :
$existe_deja = false;
foreach($arrayUsId as $utilisateur){
  if( $utilisateur['usId'] == $usId ){
    $existe-deja = true;
    break; 
  }
}

par béka » 09 août 2007, 16:08

oui le break je savais. C'est juste la syntaxe

foreach ($arrayComment as $key=>$value) que j'ai du mal a assimiler.

Le reste de cette boucle, ca va.

En tout cas, merci à vous deux.

Je vais me lancer dans un autre tableau pour autre chose... je vais essayer de me débrouiller seul.


EDIT
c'et encore moi,

j'ai une question. Comment peut-on vérifier si une variable est déjà présente dans un tableau multidimensionnel.

J'ai fait ainsi mais sans succès :
<?
for ($i=0; $i<$itemOn->length; $i++) {
    $usId = $itemOn->item($i)->getAttribute('usId');
    $user = $xpUsers->query('//user[@id="'.$usId.'"]');
    $nameUser = $user->item(0)->getAttribute('name');
    $firstnameUser = $user->item(0)->getAttribute('firstname');
    if ( in_array($usId, $arrayUsId) ) continue;
    $arrayUsId[$i]['usId'] = $usId;
    $arrayUsId[$i]['name'] = $nameUser;
    $arrayUsId[$i]['firstname'] = $firstnameUser;
}
echo "<pre>"; print_r($arrayUsId); echo "</pre>";
?>
Quelqu'un sait-il ou a-t-il une solution alternative ?

par Ryle » 09 août 2007, 16:04

ce que tu me propose Ryle, ca revient au même que ce que j'ai fait dans mon post précédent non ?
Euh ouep, en effet, tu n'avais pas encore posté ce message et j'étais donc parti de ton premier post :)

Pour les tableaux, c'est pas dur.. imagine toi une simple ligne avec plusieurs cases. Dans chaque case (identifiée par un index numérique ou par du texte dans le cas d'un tableau associatif) tu peux mettre n'importe quoi, y compris un nouveau tableau et ça te donne un tableau à 2 dimensions, etc... c'est pas plus compliqué que ça :)

Quant à la lecture : "foreach ($arrayComment as $key=>$value)" équivaut à "Pour chaque élément du tableau $arrayComment, considerant l'index (ou clé) dans la variable $key et la valeur associée dans $value, exécuter le code suivant."

Le break te permettant d'interrompre le code et de sortir de la boucle :)

par béka » 09 août 2007, 15:53

c'est très simple.
non :D
Je pige rien au tableau, je galère toujours en php lorsque je dois faire des tableaux.

En tout cas, merci, c'est juste ce que je voulais.
Ensuite lorsque je souhaite en afficher 3 par exemple, je fais ainsi :
<?
$i=0;
                        echo "<br>";
                        foreach ($arrayComment as $key=>$value){
                            if ( $i == 3) { break; }
                            else {
                              $comment = $date['comment'];
                              $date = $date['date'];
                              echo $date." : ".$comment."<br><br>";
                            }
                            $i++;
                        }
?>
Donc là ca marche, mais je ne comprends pas ce code, peux-tu me l'expliquer (que je ne l'utilise pas sans le comprendre)

par d0m » 09 août 2007, 15:48

c'est très simple. Dans ton code, tu modifie ton tableau qu'à un seul endroit, ici :
$arrayComment[$idUser]['date'] = $dateComment; 
$arrayComment[$idUser]['comment'] = $comment;

//ou

$arrayComment[$idUser][$j]['date'] = $dateComment; 
$arrayComment[$idUser][$j]['comment'] = $comment; ?>
c'est à cet endroit que tu définis toute la structure de ton tableau $arrayComment.

Il suffit donc de remplacer ces lignes par le code approprié pour la structure de ton tableau.
$arrayComment[] = array('idUser'   => $idUser,
                        'date'     => $dateComment,
                        'comment'  => $comment);
chaque élement de ton tableau étant un commentaire d'un utilisateur donné à une date donné

par béka » 09 août 2007, 15:20

et comment créer le tableau que tu me propose alors ?