如何在每个php中解决这个不推荐使用的函数

如何在每个php中解决这个不推荐使用的函数,php,Php,在PHP7.2中,每个都不推荐使用。说: 警告从PHP 7.2.0开始,此函数已被弃用。非常不鼓励依赖此功能 如何更新代码以避免使用它?以下是一些例子: //迭代到数组末尾或限制>数组长度 $i=0; 重置($阵列); while((列表($id,$item)=每个($array))| |$i

在PHP7.2中,
每个
都不推荐使用。说:

警告从PHP 7.2.0开始,此函数已被弃用。非常不鼓励依赖此功能

如何更新代码以避免使用它?以下是一些例子:

  • //迭代到数组末尾或限制>数组长度
    $i=0;
    重置($阵列);
    while((列表($id,$item)=每个($array))| |$i<30){
    //代码
    $i++;
    }
    

  • 您可以使用和创建自己的
    each()
    函数。然后用该函数替换调用,如下所示:

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

    三,

  • 对于前两个示例,可以使用
    key()
    current()
    来分配所需的值

    $ar = $o->me;   // reset isn't necessary, since you just created the array
    $typ = key($ar);
    $val = current($ar);
    
  • 在这些情况下,您可以使用
    next()
    在之后推进光标,但如果其余代码不依赖于此,则可能不需要这样做

  • 对于第三种情况,我建议只使用
    foreach()
    循环,并在循环内分配
    $kv

    foreach ($broken as $k => $v) {
         $kv = [$k, $v];
    }
    
  • 对于第四种情况,似乎在
    list()
    中忽略了键,因此可以指定当前值

    $this->result = current($this->cache_data);
    
    与前两种情况一样,可能需要使用
    next()
    推进光标,这取决于代码的其余部分如何与
    $this->cache_data
    交互

  • 第五个可以替换为
    for()
    循环

    reset($array);
    for ($i = 0; $i < 30; $i++) {
        $id = key($array);
        $item = current($array);
        // code
        next($array);
    }
    
    reset($array);
    对于($i=0;$i<30;$i++){
    $id=键($array);
    $item=当前($array);
    //代码
    下一个($数组);
    }
    
  • 更新

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

    您绝对不应该这样做的方式是将函数“返回到php”添加到php.ini中的auto_prepend_文件设置中

    auto_prepend_file = "/var/www/php/auto_prepend.php"
    
    然后创建文件并使用函数包装器输入函数

    <?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;
        }
    }
    

    使用这个函数怎么样

    function array_fetch(array $a) {
       $element = current($a);
       next($a);
       return $element;
    }
    
    2019+即时升级
    each()

    实际上有很多情况下,
    each()
    都可以被替换,这就是为什么在这个问题上有这么多不同的向上投票的答案

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

    您可以手动逐个替换。但是没有更好的办法吗

    我帮助迁移项目,其中有150多个这样的案例。我很懒,所以我制作了一个名为的工具,它可以按照上面的方式转换代码(+还有更多的情况,但我不想垃圾发布答案)

    它是
    PHP_72
    集合的一部分


    升级代码的4个步骤 1.安装它 2.创建
    rector.php
    config 3.添加
    PHP_72
    set 我希望它能帮助您完成迁移




    如果有什么错误或异常,那就是校长错案了,因此,我们可以修复它并使其适用于每种情况。

    如果您想完全模拟每种情况,我想您需要在输出中使用“键”和“值”键以及0和1。@不要使用编辑过的NIC答案,这种情况不需要它,但可能会有其他情况。感谢您的建议。请务必注意,这些值并不等效,尽管在大多数情况下,foreach就足够了–如果您在while循环中修改
    $array
    ,它将迭代修改后的值
    foreach
    创建列表的副本并对其进行迭代,因此对
    $array
    的突变不会改变循环。@jpschroeder这是正确的。另外,对于foreach,重置是不必要的。在foreach之前重置大部分是usless。这是完全不同的功能。。。不能在递归中使用。对于4.,我认为将
    list($a,$b)=each($arr)
    替换为
    list($a,$b)=数组(key($arr),current($arr));其次($arr)不是吗?@Metal3d是的,应该是等效的。虽然就我个人而言,我不会使用list,但我只会使用key()和current()直接分配给$a和$b。我知道这还需要一行代码,但它似乎比创建数组用list()将值取回来更简单。不过,这只是我的意见。:-)请参阅下面的universal automated migration version(通用自动迁移版本):对于案例1,我认为您需要确保调用current()后内部指针处于高级状态,因为它不会移动指针。最后一个使用key()和current()的示例在值方面是正确的,但忽略了这样一个事实,即每个()都会作为副作用推进数组光标。另外,在list()调用中,您可能指的是$val,而不是$callback。适当的替换是:-列表($key,$val)=每个($callbacks)+$键=键($opt->option)+$val=当前($opt->option)+下一步(回调);你能为它创建一个问题,这样它就被修复了吗?我没有使用那个库,我只是在谷歌上搜索一个each()替换项,在这里找到了你的帖子,发现它很有用,但我想我会指出这个小遗漏,这样你就可以更正你的帖子了。我明白了。在Github回购协议中,仍然可以更好地解决这一问题。维护人员很少访问他们以前的响应,错误通常会更多people@Nils我已经更新了示例。从内联代码中读取文本注释是非常困难的,这样会更好。你能检查一下吗?这看起来像是xmlrpc库中的东西。我也不得不去修复一些东西,哈哈。是的,它被弃用了,没有什么令人信服的原因,只是让人们改变他们的代码,却什么也得不到。PHP世界的另一个挫折。在我的例子中,替换函数运行到一个无止境的循环中。可能是因为它没有考虑到
    reset()
    next()
    $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = [key($out), current($out)];
    
    foreach ($broken as $k => $v) {
         $kv = [$k, $v];
    }
    
    $this->result = current($this->cache_data);
    
    reset($array);
    for ($i = 0; $i < 30; $i++) {
        $id = key($array);
        $item = current($array);
        // code
        next($array);
    }
    
    reset($array);
    while (list($key, $value) = each($array)) {
    
    reset($array);
    foreach($array as $key => $value) {
    
    auto_prepend_file = "/var/www/php/auto_prepend.php"
    
    <?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;
        }
    }
    
    function array_fetch(array $a) {
       $element = current($a);
       next($a);
       return $element;
    }
    
    -while (list($key, $callback) = each($callbacks)) {
    +foreach ($callbacks as $key => $callback) {
         // ...
     }
    
    -while (list($key) = each($callbacks)) {
    +foreach (array_keys($callbacks) as $key) {
         // ...
     }
    
    composer require rector/rector --dev
    
    vendor/bin/rector init
    
    <?php
    
    use Rector\Core\Configuration\Option;
    use Rector\Set\ValueObject\SetList;
    use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
    
    return static function (ContainerConfigurator $containerConfigurator): void {
        $parameters->set(Option::SETS, [
            Setlist::PHP_72,
        ]);
    };
    
    vendor/bin/rector process src --set php72