Commande each plus valide en php 8.1

Résolu
giludo -  
 giludo -
Bonjour,
Je n'arrive pas à transformer une commande each en foreach : le résultat est vide

commande initiale :
while (list($room_key) = each($room_hash)) $rooms[] = $room_key;
nouvelle commande :
foreach ($room_hash as $room_key) $rooms[] = $room-key;

A quoi sert le préfixe list( et comment le reconduire ?
Dans la commande initiale, le préfixe est indispensable

Merci de votre aide
giludo

7 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Commence par nous faire un
    var_dump($room_hash);
    

    et montre nous ce que ça te donne.

    Ensuite, explique nous ce que tu veux obtenir dans ta variable $rooms

    0
  2. giludo
     
    Bonsoir et merci,

    voila ce que j'obtiens avec each :
    array(3) { ["Saint Pierre"]=> int(1) ["Saint André"]=> int(1) ["Sainte Cécile"]=> int(1) }

    et avec foreach :
    array(3) { ["Saint Pierre"]=> int(1) ["Saint André"]=> int(1) ["Sainte Cécile"]=> int(1) }

    C'est la même chose, et pourtant par la suite, j'ai le message avec le foreach : Division by zero et dans le tableau, un 1 au lieu du nom que je vous ai montré, et des cases vides au lieu des chiffres habituels

    Cordialement
    Giludo
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Tu n'as pas répondu à mes questions ......

      Mais je suppose que ce que tu veux obtenir, c'est la liste des "clés"....
      Tu pourrais, dans ton foreach faire
      $rooms = [];
      foreach($room_hash as $K => $V){
        $rooms[] = $K;
      }
      


      Sinon, plus propre.. il existe la fonction array_keys
      https://www.php.net/manual/fr/function.array-keys.php
      0
    2. giludo
       
      voici le code servant à créer le tableau :
      while (list($room_key) = each($room_hash)) $rooms[] = $room_key;
      sort($rooms);
      reset($name_hash);
      while (list($name_key) = each($name_hash)) $names[] = $name_key;
      // foreach ($name_hash as $name_key) $names[] = $name_key;
      sort($names);
      $n_rooms = sizeof($rooms);
      $n_names = sizeof($names);

      // On affiche uniquement pour une sortie HTML
      if ($csv == "n")
      {
      if ($sumby=="1")
      $premiere_cellule = "Paroisse";
      else if ($sumby=="5")
      $premiere_cellule = "Type";
      else if ($sumby=="6")
      $premiere_cellule = "Utilisateur";
      else if ($sumby=="7")
      $premiere_cellule = "Jour";
      else if ($sumby=="8")
      $premiere_cellule = "Semaine";
      else if ($sumby=="9")
      $premiere_cellule = "Mois";
      else
      $premiere_cellule = grr_sql_query1("select fieldname from grr_overload where id='$sumby'");

      echo "<hr /><h1>Comptage des réservations : (nombre) heures / frais </h1><table border=2 cellspacing=4>\n";
      if ($sumby=="1")
      echo "<tr><td class=\"BL\" align=left><b>".$premiere_cellule." \ Mois</b></td>\n";
      else
      echo "<tr><td class=\"BL\" align=left><b>".$premiere_cellule." \ Salle</b></td>\n";
      }

      for ($c = 0; $c < $n_rooms; $c++)
      {
      if ($csv == "n")
      echo "<td class=\"BL\" align=left><b>$rooms[$c]</b></td>\n";
      else
      echo "$rooms[$c]\t";

      $col_count_total[$c] = 0;
      $col_hours_total[$c] = 0.0;
      $col_frais_total[$c] = 0;
      }
      if ($csv == "n")
      echo "<td class=\"BR\" align=right><br><b>Total</b></td></tr>\n";
      else
      echo "Total\t\r\n";

      $grand_count_total = 0;
      $grand_hours_total = 0;
      $grand_frais_total = 0;

      for ($r = 0; $r < $n_names; $r++)
      {
      $row_count_total = 0;
      $row_hours_total = 0.0;
      $row_frais_total = 0;
      $name = $names[$r];
      if ($csv == "n")
      echo "<tr><td class=\"BR\" align=right><b>$name</b></td>\n";
      else
      echo "$name\t";

      for ($c = 0; $c < $n_rooms; $c++)
      {
      $room = $rooms[$c];
      if (isset($count[$room][$name]))
      {
      $count_val = $count[$room][$name];
      $hours_val = $hours[$room][$name];
      $frais_val = $frais[$room][$name];
      cell($count_val, $hours_val, $frais_val, $csv, $decompte);

      $row_count_total += $count_val;
      $row_hours_total += $hours_val;
      $row_frais_total += $frais_val;

      $col_count_total[$c] += $count_val;
      $col_hours_total[$c] += $hours_val;
      $col_frais_total[$c] += $frais_val;

      } else {
      if ($csv == "n")
      echo "<td> </td>\n";
      else
      echo "\t";
      }
      }
      cell($row_count_total, $row_hours_total, $row_frais_total, $csv, $decompte);

      if ($csv == "n")
      echo "</tr>\n";
      else
      echo "\r\n";
      $grand_count_total += $row_count_total;
      $grand_hours_total += $row_hours_total;
      $grand_frais_total += $row_frais_total;
      $grand_moyenh_total = round($row_hours_total/$row_count_total);
      $grand_moyenf_total = round($row_frais_total/$row_count_total);
      }
      0
  3. giludo
     
    J'ai modifié les foreach de la manière suivante :

    // while (list($room_key) = each($room_hash)) $rooms[] = $room_key;
    foreach ($room_hash as $room_key=>$room_val) $rooms[] = $room_val;

    // while (list($name_key) = each($name_hash)) $names[] = $name_key;
    foreach ($name_hash as $name_key=>$name_val) $names[] = $name_val;

    sans changement
    giludo
    0
  4. giludo
     
    ça y est, c'est bon avec :

    foreach ($room_hash as $room_key=>$room_val) $rooms[] = $room_key;
    et
    foreach ($name_hash as $name_key=>$name_val) $names[] = $name_key;

    MERCI
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. giludo
     
    Bonsoir, j'ai un autre souci avec la ligne :
    while ( list( $lib, $pos ) = each ($tab) )
    Il semble que le remplacement par :
    foreach ($colonnes as list($lib, $pos))
    ne fonctionne pas correctement.

    la commande
    $texte = $tab[$lib];
    provoque le message :
    Clé de tableau non définie « »

    description des tables :
    $colonnes { ["Date et Heure"]=> int(31) ["Fin"]=> int(14) ["Réservation"]=> int(78) ["Salle"]=> int(43) ["Montant"]=> int(20) }
    $tab { ["Date et Heure"]=> string(16) « 06/01/22 15:00 » ["Fin"]=> string(5) « 16:45 » ["Réservation"]=> string(1) " " ["Salle"]=> string(11) « Saint André " ["Montant"]=> string(8) « 230.00 " }

    Merci de votre aide
    0
    1. giludo
       
      j'ai fait une petite erreur de recopie : le while était en fait : while (list($lib, $pos) = each($colonnes)), bien sûr
      0
  7. giludo
     
    Merci jordan45 pour ton message, mais ce n'est pas le même cas que ma précédente demande : il s'agit de récupérer les 2 colonnes de la table, comme c'était dèjà le cas avec la commande each.
    Dans la documentation, ce cas est prévu
    Merci pour tes lumières
    giludo

    ;
    0
  8. giludo
     
    Bonsoir,
    Finalement, il faut appliquer la formule standard même dans ce cas.
    Le problème est maintenant résolu
    Cordialement
    Gilles HUDAULT
    0