<?php
namespace foo;
class bar{
public static function runner( $data )
{
extract ($data);
foreach( $elements as $element )
{
$varsToWipe = array_keys($element);
extract( $element );
/*
bunch of code using the variables extracted from $element, eg if( isset($runnerSpeed) )
*/
//now i want to be able to unset all the elements set from the extract within the foreach loop
foreach( $varsToWipe as $var )
{
//but what goes here in the unset function?
\unset( );
}
}
}
}
如何在runner方法中取消设置从foreach循环中提取的变量?
$ data的内容可以变化,并且需要取消设置变量,以便在下一次循环迭代时不再使用。我知道我可以自己编辑数组,但是如果可行则可以更快地编写...
谢谢, 约翰
一个更简单的foreach示例:
$array = range(0,6);
$i = 0;
foreach( $array as $a )
{
echo $i.' ';
if( $i == 0 )
{
$egg = true;
}
++$i;
if( isset($egg) )
{
echo 'eggs ';
}
}
将打印
0个鸡蛋1个鸡蛋2个鸡蛋3个鸡蛋4个鸡蛋5个鸡蛋6个鸡蛋
然后你可以从全局变量中删除$ egg,因为它就在这里:
$array = range(0,6);
$i = 0;
foreach( $array as $a )
{
echo $i.' ';
if( $i == 0 )
{
$egg = true;
}
else
{
unset( $GLOBALS['egg'] );
}
++$i;
if( isset($egg) )
{
echo 'eggs ';
}
}
现在它会打印出来:
0 eggs 1 2 3 4 5 6
但是当你在一个类方法中,你实际存储的变量是什么时才取消设置?
答案 0 :(得分:0)
首先不要使用extract()
函数,只需迭代给定的数组。
<?php
class Foo {
public function runner($data) {
foreach ($data as $delta => $element) {
if ($element === "something") {
// do something
}
}
}
}
当然你现在可以在数组中解开一些东西,但你为什么要这样做?我无法理解为什么因为数组没有通过引用传递而且在循环之后没有使用它所以它将超出范围并且简单地由垃圾收集器收集。
如果是嵌套数组:
foreach ($data as $delta => $element) {
if (is_array($element)) {
foreach ($element as $deltaInner => $elementInner) {
// ...
答案 1 :(得分:0)
现在很晚,但供参考。
你可以直接用以下方法取消()它们:
unset($$var);
提取物的作用相当于:
foreach($arr as $key => $value) {
$$key = $value;
}
所以要取消设置:
foreach(array_keys($arr) as $key) {
unset($$key);
}
但是如上所述,您不需要取消设置它们,因为它们在函数完成时被删除,因为它们将超出范围。
此外,extract()完全正常,因为它(很可能)不会复制数据值,它只是为每个数组键创建新符号。 PHP内部只会复制值,如果您实际修改它,即。带引用计数的写时复制。
您可以在对大型数组执行extract()之前和之后使用memory_get_usage()对此进行测试。