IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

La fonction sizeof me provoque une erreur d'affichage d'un tableau


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut La fonction sizeof me provoque une erreur d'affichage d'un tableau
    Bonjour

    J'ai un problème avec le sizeof(). Au dépard il me compte bien les lignes
    que contient le tableau (8 lignes). L'affichage des lignes est bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Array ( [0] => Array ( [0] => 1 [1] => 1 [2] => 2 [3] => 3 ) 
    //        [1] => Array ( [0] => 2 [1] => 4 [2] => 5 [3] => 6 ) 
    //        [2] => Array ( [0] => 3 [1] => 7 [2] => 8 [3] => 9 ) 
    //        [3] => Array ( [0] => 4 [1] => 10 [2] => 11 [3] => 12 ) 
    //       [4] => Array ( [0] => 5 [1] => 13 [2] => 14 [3] => 15 ) 
    //        [5] => Array ( [0] => 6 [1] => 16 [2] => 17 [3] => 18 ) 
    //        [6] => Array ( [0] => 7 [1] => 19 [2] => 20 [3] => 21 ) 
    //        [7] => Array ( [0] => 8 [1] => 22 [2] => 23 [3] => 24 ) )
    J'efface la ligne 1 ayant la clé 0. avec la fonction ci-dessous

    tr.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $b=$_SESSION['b'];// contient le tableau
    $e=$_POST['sel'];// contient les clé à effacer
    foreach ($e as $ligne) {
             if (array_key_exists($ligne, $b)) {unset($b[$ligne]);}
             else{echo"la clé n'existe pas<br/>";}
                           }
    $sc=$b;$_SESSION['b']=$sc;
    header("location:test.php");
    test.php (affichage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?php
    $b=$_SESSION['b'];
    ?>
    <form method="post" action="tr.php">
    <table border="1" align="center" cellpadding="0" cellspacing="0"><?php 
    $nbr=sizeof($b);
    for($i=0;$i<=$nbr;$i++){
                      if($b[$i][0]!=""){$keys=array_search($b[$i],$b);
    echo'<tr>
    	<td colspan="1"><input type="checkbox" name="sel[]" value="'.$keys.'" />'.$keys.'</td>
    	<td colspan="1">'.$b[$i][1].'</td>
    	<td colspan="1">'.$b[$i][2].'</td>
    	<td colspan="1">'.$b[$i][3].'</td>
         </tr>
        ';
    						            }
                              }
    ?>
    <tr>
        <td colspan="2">cliquez sur le bouton pour détruire</td><td align="center" colspan="1"><input type="submit" name="delete" value="2" /></td>
        <td colspan="2"><?php echo $nbr;?></td>
    </tr>
    </table>
    </form>
    <?php ?>
    Le print_r(); me donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Array ( [1] => Array ( [0] => 2 [1] => 4 [2] => 5 [3] => 6 ) 
    //        [2] => Array ( [0] => 3 [1] => 7 [2] => 8 [3] => 9 ) 
    //        [3] => Array ( [0] => 4 [1] => 10 [2] => 11 [3] => 12 ) 
    //        [4] => Array ( [0] => 5 [1] => 13 [2] => 14 [3] => 15 ) 
    //        [5] => Array ( [0] => 6 [1] => 16 [2] => 17 [3] => 18 ) 
    //        [6] => Array ( [0] => 7 [1] => 19 [2] => 20 [3] => 21 ) 
    //        [7] => Array ( [0] => 8 [1] => 22 [2] => 23 [3] => 24 ) )
    A l'affichage c'est bon. Le sizeof me donne bien 7

    Par contre si je re execute la fonction de destruction avec une
    nouvelle clé par exemple : 1

    La ligne est bien effacée. Mais l'affichage me montre que la ligne
    1 est effacée, cependant la dernière ligne ne s'affiche pas. Le
    sizeof me donne 5 au lieu de 6.

    Je fais un print_r(). La dernière ligne n'est pas effacer et j'ai
    6 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Array ( [2] => Array ( [0] => 3 [1] => 7 [2] => 8 [3] => 9 ) 
    //        [3] => Array ( [0] => 4 [1] => 10 [2] => 11 [3] => 12 ) 
    //        [4] => Array ( [0] => 5 [1] => 13 [2] => 14 [3] => 15 ) 
    //        [5] => Array ( [0] => 6 [1] => 16 [2] => 17 [3] => 18 ) 
    //        [6] => Array ( [0] => 7 [1] => 19 [2] => 20 [3] => 21 ) 
    //        [7] => Array ( [0] => 8 [1] => 22 [2] => 23 [3] => 24 ) )
    Si je recommence tout et que j'efface 2 lignes d'entrée par exemple la
    0 et 1 en clé.
    Il m'efface bien les 2 lignes mais à l'affichage je n'ai que 5 lignes.
    La dernière ligne est passé à la trappe, or elle existe bien quand je
    fais un print_r()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Array ( [2] => Array ( [0] => 3 [1] => 7 [2] => 8 [3] => 9 ) 
    //        [3] => Array ( [0] => 4 [1] => 10 [2] => 11 [3] => 12 ) 
    //        [4] => Array ( [0] => 5 [1] => 13 [2] => 14 [3] => 15 ) 
    //        [5] => Array ( [0] => 6 [1] => 16 [2] => 17 [3] => 18 ) 
    //        [6] => Array ( [0] => 7 [1] => 19 [2] => 20 [3] => 21 ) 
    //        [7] => Array ( [0] => 8 [1] => 22 [2] => 23 [3] => 24 ) )
    Le sizeof() me donne 6 ce qu'est bon, mais l'affichage ne m'affiche
    que 5 lignes

    Si je re-fait un effacage de 2 lignes exemple 2 et 3

    J'obtiens en print_r() ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Array ( [4] => Array ( [0] => 5 [1] => 13 [2] => 14 [3] => 15 ) 
    //        [5] => Array ( [0] => 6 [1] => 16 [2] => 17 [3] => 18 ) 
    //        [6] => Array ( [0] => 7 [1] => 19 [2] => 20 [3] => 21 ) 
    //        [7] => Array ( [0] => 8 [1] => 22 [2] => 23 [3] => 24 ) )
    les lignes sont effacées. Mais en affichage je n'ai plus qu'une ligne
    Le sizeof me donne 4. La c'est bon mais l'affichage non je n'ai plus
    qu'une ligne.

    Question :
    Qu'est ce qu'il se passe pour que le sizeof() me fasse des erreurs ainsi que
    l'affichage ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Sans regarder le detail de ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $nbr=sizeof($b);
    for($i=0;$i<=$nbr;$i++){
    Tu as les entrées 0,1,2 et 3
    Ca te fait $nbr = 4, et donc tu cherches à afficher de 0,1,2,3 et 4

    Si tu supprimes l'entrée 1 et 3, il te reste 0,2
    $nbr = 2, et toi tu cherches donc à afficher 0, 1, 2

    Pour parcourir un tableau, il faut utiliser foreach()
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 329
    Points : 126
    Points
    126
    Par défaut rep
    cela fonctionne j'ai modifier tr.php
    j'ai mis cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sc=array_merge($b);$_SESSION['b']=$sc;
    $val=$_SESSION['b'];
    $nbr=sizeof($val);
    $_SESSION['a'][1]=$nbr;
    Cela fonctionne maintenant.

    Donc quand on supprime des lignes par des clés il faut reconstruire le tableau avec de nouvelles clées. Le array_merge() permet de reconstruire le tableau avec les lignes restantes. Et la j'ai plus de problème.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/04/2012, 12h18
  2. msaccess a provoqué une erreur dans KERNEL32.dll
    Par massol joel dans le forum Access
    Réponses: 12
    Dernier message: 03/04/2006, 14h32
  3. Cells (1,1) provoque une erreur
    Par Opo dans le forum Access
    Réponses: 9
    Dernier message: 07/03/2006, 16h29
  4. [SGBD] mysql_fetch_array provoque une erreur
    Par nicerico dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/10/2005, 14h20
  5. Select Case provoque une erreur
    Par defluc dans le forum SQL
    Réponses: 6
    Dernier message: 14/08/2005, 23h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo