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. 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

    0
    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
      0
      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
        0
      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);
        }
        0
    2. 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
      1. ç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
        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
          0
          1. j'ai fait une petite erreur de recopie : le while était en fait : while (list($lib, $pos) = each($colonnes)), bien sûr
            0
        2. 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
          1. Bonsoir,
            Finalement, il faut appliquer la formule standard même dans ce cas.
            Le problème est maintenant résolu
            Cordialement
            Gilles HUDAULT
            0