114 votes

Comment résoudre cette fonction obsolète chaque php

Avec PHP 7.2, each est obsolète. La documentation dit:

Avertissement Cette fonction est OBSOLÈTE depuis PHP 7.2.0. Sur la base de cette fonction est fortement déconseillée.

Comment puis-je mettre à jour mon code d'éviter de l'utiliser? Voici quelques exemples:

  1. $ar = $o->me;
    reset($ar);
    list($typ, $val) = each($ar);
    
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = each($out);
    
  3. for(reset($broken);$kv = each($broken);) {...}
    
  4. list(, $this->result) = each($this->cache_data);
    
  5. // iterating to the end of an array or a limit > the length of the array
    $i = 0;
    reset($array);
    while( (list($id, $item) = each($array)) || $i < 30 ) {
        // code
        $i++;
    }
    

102voto

Don't Panic Points 26317

Pour vos deux premiers exemples de cas, vous pouvez utiliser key() et current() pour affecter les valeurs dont vous avez besoin.

  1. $ar = $o->me;   // reset isn't necessary, since you just created the array
    $typ = key($ar);
    $val = current($ar);
    
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = [key($out), current($out)];
    

Dans ces cas, vous pouvez utiliser next() pour faire avancer le curseur par la suite, mais il peut ne pas être nécessaire si le reste de votre code ne dépend pas de cela.

  1. Pour le troisième cas, je vous suggère de simplement en utilisant un foreach() boucle au lieu et à l'attribution d' $kv à l'intérieur de la boucle.
    foreach ($broken as $k => $v) {
        $kv = [$k, $v];
    }
  1. Pour le quatrième cas, il semble que la clé est omise dans list(), de sorte que vous pouvez affecter la valeur actuelle.
    $this->result = current($this->cache_data);

Comme les deux premiers cas, il peut être nécessaire de faire avancer le curseur avec next() selon la façon dont le reste de votre code interagit avec $this->cache_data.

  1. Cinquième peut être remplacé par un for() boucle.
    reset($array);
    for ($i = 0; $i < 30; $i++) {
        $id = key($array);
        $item = current($array);
        // code
        next($array);
    }

43voto

Tomáš Votruba Points 78

2019+ Instantanée de Mise à niveau de l' each()

Il y a effectivement beaucoup de cas each() peut être remplacé, c'est pourquoi il ya beaucoup de différents upvoted réponses à cette question.

-while (list($key, $callback) = each($callbacks)) {
+foreach ($callbacks as $key => $callback) {
     // ...
 }

Et:

-while (list($key) = each($callbacks)) {
+foreach (array_keys($callbacks) as $key) {
     // ...
 }

Et:

-list($key, $callback) = each($callbacks);
+$key = key($opt->option);
+$val = current($opt->option);

Vous pouvez remplacer un par un manuellement. Mais n'est-il pas une meilleure façon?

Je l'aide à migrer des projets, où plus de 150+ de tels cas. Je suis paresseux j'ai donc fait un outil appelé Recteur, qui convertit le code de la manière ci-dessus (+ il y a plus de cas, mais je ne veux pas de spam la réponse).

C'est une partie de l' php72 ensemble.

Il suffit de l'installer et de l'utiliser:

composer require rector/rector --dev
vendor/bin/rector process src --level php72

J'espère que cela vous aide avec votre migration.


Si il y a un bug ou d'une anomalie, c'est le Recteur manqué cas. Créer un problème, afin que nous puissions le corriger et le faire fonctionner pour tous les cas possibles.

41voto

Wee Zel Points 1003

vous pouvez créer votre propre each() fonction à l'aide de la touche(), courant() et next(). puis remplacez vos appels à cette fonction, comme ceci:

<?php
function myEach(&$arr) {
    $key = key($arr);
    $result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
    next($arr);
    return $result;
}

1.

$ar = $o->me;
reset($ar);
list($typ, $val) = myEach($ar);

2.

$out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
$expected = myEach($out);

3.

for(reset($broken);$kv = myEach($broken);) {...}

11voto

Stewen Guyon Points 71
 reset($array);
while (list($key, $value) = each($array)) {
 

METTRE À JOUR

 reset($array);
foreach($array as $key => $value) {
 

3voto

Tyranin Points 494

La façon dont vous certainement ne devriez pas faire est de mettre la fonction "retour en php" en l'ajoutant à la auto_prepend_file réglage en php.ini

auto_prepend_file = "/var/www/php/auto_prepend.php"

Faites ensuite le fichier et entrez dans la fonction avec un function_exists wrapper.

<?php
/**
 * Adds the depreciated each() function back into 7.2
 */
if (!function_exists('each')) {
    function each($arr) {
        $key = key($arr);
        $result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
        next($arr);
        return $result;
    }
}

Il s'agit essentiellement, déclare la fonction avant de votre application php s'exécute. Lorsque votre application tente d'exécuter la fonction de chaque il va utiliser votre version à la place.

Ce n'est absolument pas la façon dont vous devriez être en train d'approcher ce problème, en particulier dans la production! Cependant, vous êtes un développeur de avec les contraintes de temps et vous voulez juste essayer arbitraire des cadres pour votre prochain projet et ils n'ont pas été mis à jour pour fonctionner sur votre serveur de développement sans enroulant votre version de php.

Lorsque vous avez commis une base de code pour votre projet s'il vous plaît aller de l'avant et de mettre en œuvre les changements dans la accepté de répondre parce qu'ils ne travaillent.

J'ai utilisé Wee Zel l'émulation de la fonction de chaque

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X