PHP 7.2:每个都已弃用。如何转换这些例子? [复制]

Posted

技术标签:

【中文标题】PHP 7.2:每个都已弃用。如何转换这些例子? [复制]【英文标题】:PHP 7.2: each is deprecated. How to convert these examples? [duplicate] 【发布时间】:2018-12-22 04:11:41 【问题描述】:

php 7.2 中,each 已弃用。 The documentation 说:

警告 自 PHP 7.2.0 起,该功能已被弃用。强烈建议不要依赖此函数。

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

    while ($x = each($y)

    while (($x = each($y)) && ($a = each($b)))

我相信在这些情况下我需要使用foreach,但我不确定如何正确使用。我已经在 *** 和其他网站上查看了很多示例,但没有一个示例是像上面 2 那样构造的。

编辑 如果可能的话,我正在寻找这些while 单行代码的通用插入式代码替换(仅一行或几行代码),这不需要完整的脚本/应用程序重写,因为以上的变化。

谢谢

【问题讨论】:

你能更深入地了解你想要完成的工作吗 您可以尝试foreach ($y as $x) ... 作为您的第一个示例。第二个示例涉及一次迭代两个数组,因此您需要了解数组指针。 (例如PHP的next函数) 乍一看,这似乎很简单,但它却是非常具有挑战性的。在将近 10 年的时间里,我从来不需要一次循环两个数组。我很想听听更多关于您要完成的工作,因为听起来应该有更简单的方法; double each() 似乎是某事的创可贴,而不是设计决策。但是,我将假设此代码不是您的,您只是在寻找相同的替代品。 如果$y$b 使用相同的密钥,您可以使用foreach ($y as $key => $x) $b[$key] .. 请澄清一下,您是否需要同时访问循环内的键和值? 【参考方案1】:

我意识到您正在寻找一个通用的等效替代品来替代这两个与 PHP 7.2 兼容的示例,我希望这里有人会回答这个问题(因为这可能会帮助许多人迁移到 php 7.2 及更高版本),但是我确实有特定于your script example 的答案,如果不是普遍的,它至少会在这种特定情况下帮助你。

完全披露:我知道并使用该特定脚本(在 PHP 7.2 服务器上)。

while (($ut = each($user_tracking)) && ($listed++ < CONFIG_USER_TRACKING_SESSION_LIMIT)) 

应改为:

foreach ($user_tracking as $ut['value']) 
if ($listed++ >= CONFIG_USER_TRACKING_SESSION_LIMIT) 
  break;

查找:

while (($pu = each($ut['value']['last_page_url']))&&($du = each($ut['value']['page_desc']))) 

然后改为:

foreach ($ut['last_page_url'] as $key => $pu) 
          $du = $ut['page_desc'][$key];

确实需要在下面重写一个小的代码,因为我们已将数组更改为字符串,但仍然可以获得我们需要的数据。

查找:

<tr bgcolor=ffffff> 
    <td class="dataTableContent" valign=top align="right"><?php echo date('H:i:s', $pu['key']); ?></td> 
    <td class="dataTableContent" nowrap valign=top align="left">&nbsp;<a href="<?php echo $pu['value']; ?>" target="_new"><?php if ($du['value']!='') echo $du['value']; ?></a>&nbsp;</td> 
    <td class="dataTableContent" width=100% align="left"><a href="<?php echo $pu['value']; ?>" target="_new"><?php echo chunk_split($pu['value'],40,"<br>"); ?></a></td> 
</tr>

然后改为:

<tr bgcolor=ffffff> 
    <td class="dataTableContent" valign=top align="right"><?php echo date('H:i:s', $key); ?></td> 
    <td class="dataTableContent" nowrap valign=top align="left">&nbsp;<a href="<?php echo $pu; ?>" target="_new"><?php if ($du!='') echo $du; ?></a>&nbsp;</td> 
    <td class="dataTableContent" width=100% align="left"><a href="<?php echo $pu; ?>" target="_new"><?php echo chunk_split($pu,40,"<br>"); ?></a></td> 
</tr>

希望这会有所帮助。

【讨论】:

非常感谢!实际上,这些更改使脚本 php 7.2 兼容并完美运行。由于删除了each,仍然希望获得不需要脚本/应用程序重写的通用等效项。再次感谢!【参考方案2】:

这是处理示例 #2 的一种方法:

<?php
$y = ['f','g','e'];  // 3 items
$b = ['b'=>'hi', 6]; // 2 items

// Get an indexed array of keys from both arrays
$y_keys = array_keys($y);
$b_keys = array_keys($b);

// Loop one of the keysets
foreach( $y_keys as $k=>$v )

    // Check the other keyset to see if it contains as many elements
    if(isset($b_keys[$k]))
    
        $x = [ $v => $y[$v] ];
        $a = [ $b_keys[$k] => $b[$b_keys[$k]] ];

        // Freely use $x and $a moving forward

        var_dump($x, $a);
    
    else
    
        // stop looping because one array has more/less than the other
        break;
    


示例 #1 要简单得多:

<?php
$y = ['f','g','e'];  // 3 items

foreach( $y as $k=>$v )

    $x = [ $k => $v ];

【讨论】:

这对于孤立的例子 2 来说是完美的;但是,如果您要移植其他人的代码,请不要盲目地复制/粘贴它。一些遗留代码可能依赖于内部数组指针。例如。在while(each... 循环之后,它将位于较大数组中间的某个位置。但是,当您使用替换时它不会移动。 3v4l.org/sen9t

以上是关于PHP 7.2:每个都已弃用。如何转换这些例子? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Modernizr.load 已弃用。 Yepnope.js 已弃用。怎么办?

OneHotEncoder categorical_features 已弃用,如何转换特定列

KissXML 和 GData 已弃用?

如何找到依赖于已弃用库的 PHP 模块?

如何更新使用已弃用 each() 函数的代码?

如何在最新的 XAMPP 上运行已弃用的 php 代码 [重复]