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"> <a href="<?php echo $pu['value']; ?>" target="_new"><?php if ($du['value']!='') echo $du['value']; ?></a> </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"> <a href="<?php echo $pu; ?>" target="_new"><?php if ($du!='') echo $du; ?></a> </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 已弃用。怎么办?