web-dev-qa-db-fra.com

PHP 7.2 obsolète: while = each () boucle sans $ value

Comme la boucle each () est déconseillée depuis PHP 7.2, comment mettre à jour la boucle while (( each ())) == sans $ value ?

Sans $ value je ne peux pas faire fonctionner la boucle foreach. De plus while ($ products_id = $ this-> contents) entraîne une boucle infinie.

Je vous remercie!

function count_contents() {  // get total number of items in cart 
  $total_items = 0;
  if (is_array($this->contents)) {
    reset($this->contents);
    while (list($products_id, ) = each($this->contents)) {
      $total_items += $this->get_quantity($products_id);
    }
  }
  return $total_items;
}
function get_quantity($products_id) {
  if (isset($this->contents[$products_id])) {
    return $this->contents[$products_id]['qty'];
  } else {
    return 0;
  }
}
9
Petro Mäntylä

J'ai trouvé un moyen de le réparer et j'ai pensé partager les informations. Voici également d'autres cas sur la mise à niveau de chaque boucle () vers foreach ().

Cas 1: manquant $ value

reset($array);
while (list($key, ) = each($array)) {

Mise à jour de:

foreach(array_keys($array) as $key) {

Cas 2: manquant touche $

reset($array);
while (list(, $value) = each($array)) {

Mise à jour de:

foreach($array as $value) {

Cas 3: rien ne manque

reset($array);
while (list($key, $value) = each($array)) {

Mise à jour de:

foreach($array as $key => $value) {
26
Petro Mäntylä

Voici quelques façons de procéder:

La boucle standard foreach (très lisible):

foreach($this->contents as list($products_id)) {
    $total_items += $this->get_quantity($products_id);
}

Ou, en réduisant:

$total_items = array_reduce($this->contents, function($acc, $item) {
    return $acc + $this->get_quantity($products_id[0]);
});

Ou, dans une expression fonctionnelle:

$total_items = array_sum(array_map([$this, 'get_quantity'],
                         array_column($this->contents, 0)));

Aucune de ces méthodes n'a besoin de reset($this->contents); qui la précède.

2
trincot

Pour développer Petro Mäntylä excellente réponse correcte pour Cas 3 :

Voici un exemple complet d'une situation "Cas 3", car je trouve des exemples complets bien plus informatifs qu'un code de ligne se fragmente:

Il s'agit d'un code authentique provenant d'une ancienne base de code tierce (TCPDF)

DÉCONSEILLÉ:

while (list($id, $name) = each($attr_array)) {
      $dom[$key]['attribute'][$name] = $attr_array[$id];
      ...              
      ...             
   }

FIXÉ:

 // while (list($id, $name) = each($attr_array)) {
 foreach($attr_array as $feKey => $feRow){
    // $dom[$key]['attribute'][$name] = $attr_array[$id];
    $dom[$key]['attribute'][$feRow] = $attr_array[$feKey];
    ...
    ...
    }
 unset($feKey,$feRow);
1
Martin