2012-06-28 70 views
0
<?php 

$array = array(a,s,d,f,g,h,j,k,l); 

foreach($array as $i => &$a){ 
foreach($array as $k => &$b){ 
    if($k = 4){ 
    unset($array[1]); 
    } 
} 

echo $a . "\n"; 
} 

print_r($array); 

键盘:http://codepad.org/UoWhrIkv两个循环的foreach和取消

为什么在这个例子中echo告诉我只有"a"print_r显示所有好?可以在echo的循环中做出很好的展示?

+0

这意味着什么,在if语句中使用单等号? – Dev

+2

你想用这个做什么?我没有看到第二回路的原因。 –

回答

2

两个问题在这里:

首先是你在这一行使用=代替==

if($k = 4){ 

第二个是你的逻辑,当在同一阵列在你的内部循环迭代,它会重复取消设置$array[1]

这并不影响内部的foreach,而是影响内部的foreach。所以echo $a;有机会只打印一次。

改变你if声明:

if($k == 4){ 
    unset($b); 
} 

取得了echo $aprint the entire array(假设这是你要什么)。

+1

未设置的操作只进行一次。这样做*重置了'$ array'中的数组指针,从而使得'foreach'操作结束。使用'unset($ b)'*不会重置'$ array'中的数组指针,它只会删除一个引用(实际上什么都不做,你也可以建议彻底删除内部的'foreach')。只是为了更多的解释。或者更好的说:你的答案的后半部分是完全错误的(对不起,没有冒犯性,花了我一段时间以及弄清楚)。 – hakre

+0

有道理 - 我没有深入研究它,只是尝试了一些想到的东西,看到一个“工作”。 – nickb

+0

看来我也是错的。未设置的操作完成你所说的,并且不止一次。我测试了它,但现在测试揭示了这一点。 Urgh。我的第一个测试是修正后的'if($ k == 4)',这就是为什么它只执行一次。但是这仍然会重置外部循环,所以我们都是正确的^^ – hakre

5

我不确定你是否想要在数组或常量中使用字符串,但字符串应该像这样格式化。

$array = array('a','s','d','f','g','h','j','k','l'); 

你有错的另一件事是你的if语句

if($k == 4) 

您需要使用双等号进行比较,一个等号(=)用于分配。

您是否也可以提供您正在尝试在此处执行的操作,因为您的代码存在某些格式问题,这可能是唯一的打印原因。

3

为什么在这个例子中echo只显示我"a"print_r显示全部好?

当你修改你迭代在foreachDocs数组(在这里你删除元素)的foreach行为可能会给你意想不到的事情。从手册页说明:

由于foreach依赖于内部数组指针在循环内更改它可能会导致意外的行为。


可以很好地说明用回声循环?

是的,但这取决于您试图达到的目标。当你还没有指定什么“争气”,其实就是,我们只能猜测:

  • 分配$array到一个新的变量,并使用foreach秒钟内变量。
  • - 或者 - 不要使用引用&$a&$b,只需使用$a$b
  • - 或者 - 保存要删除的元素并跳过迭代中的元素。
  • - 或 - ...
  • - 或 - 甚至echo "good\m";

的工作代码示例可能看起来像这样(Demo):

$array = array('a','s','d','f','g','h','j','k','l'); 

foreach ($array as $i => &$a) { 
    echo "$a\n"; 
} 

print_r($array); 
+0

+1用于引用参考:) –