Commande each plus valide en php 8.1

Résolu
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. Bonsoir,
    Finalement, il faut appliquer la formule standard même dans ce cas.
    Le problème est maintenant résolu
    Cordialement
    Gilles HUDAULT
    1. 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

      ;
      1. 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
        1. j'ai fait une petite erreur de recopie : le while était en fait : while (list($lib, $pos) = each($colonnes)), bien sûr
      2. ç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
        1. 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
          1. 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
            1. Modérateur
              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
            2. 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);
              }
          2. Modérateur
            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