編輯:
問題通過在函數調用中使用$ i + 1解決。PHP:多個foreach中的變量範圍
我無法在多個foreaches中使用變量。當我嘗試在foreach中調用一個函數時,問題就出現了。每當我這樣做時,主循環的迭代器值突然變爲零(無論它在哪一圈),但是當我註釋掉函數調用時,迭代器值會再次顯示。
可能有人點我的方向是正確的,在下面的例子中變量的訪問:
這工作,因爲它不宜
for($i=0; $i<3; $i++)
{
echo $i; // 1, 2, 3
foreach($something as $value)
{
echo $i; // main loop's iterator value
foreach($value as $moreSomething)
{
echo $i; // main loop's iterator value
}
}
}
但是,這並不工作,迭代器顯示爲0。
for($i=0; $i<3; $i++)
{
echo $i; // 1, 2, 3
foreach($something as $value)
{
echo $i; // 0
foreach($value as $moreSomething)
{
echo $i; // 0
$object->addStuff($i, $moreSomething); // i = 0, moreSomething is correct
}
}
}
編輯: 我添加示例代碼來重現問題。請注意,這是關於$ i值的行爲,而不是名稱的正確順序或類似的。 我只關心爲什麼$ i的價值突然變化。可能是我的邏輯,但看到自己
(在addName(使用$ i或$ B時)函數$ I的輸出爲000000000012,使用$一則$ I的輸出突然改變爲00000000001111111222時)
class RockPaperScissors
{
private $nameArray;
// constructor
function RockPaperScissors()
{
$this->nameArray = array();
}
function addName($level, $name)
{
$this->nameArray[$level][] = $name;
}
function getNames($level)
{
$array = array();
foreach ($this->nameArray as $key => $value)
{
if ($key == $level)
{
foreach ($value as $name)
{
$array[] = $name;
}
}
}
return $array;
}
function printArray()
{
print_r($this->nameArray);
}
}
function getNewNames($name)
{
$array = array();
switch ($name)
{
case "Mickey":
$array[] = "Morty";
$array[] = "Ferdie";
break;
case "Donald":
$array[] = "Houie";
$array[] = "Dewey";
$array[] = "Louie";
break;
case "Goofy":
$array[] = "Gilbert";
break;
case "Morty":
$array[] = "Morty-B";
break;
case "Ferdie":
$array[] = "Ferdie-B";
break;
case "Houie":
$array[] = "Houie-B";
break;
case "Dewey":
$array[] = "Dewey-B";
break;
case "Louie":
$array[] = "Louie-B";
break;
case "Gilbert":
$array[] = "Gilbert-B";
break;
}
return $array;
}
$MAX_LEVELS = 3;
$RPS = new RockPaperScissors();
$RPS->addName(0, "Mickey");
$RPS->addName(0, "Donald");
$RPS->addName(0, "Goofy");
$a = 0;
$b = 0;
for ($i=0; $i<$MAX_LEVELS; $i++)
{
$namesFromRPS = $RPS->getNames($i);
echo $i;
foreach($namesFromRPS as $name)
{
echo $i;
$newNames = getNewNames($name);
foreach($newNames as $newName)
{
echo $i;
// try switching $i to $a or $b and notice the behaviour change of $i
$RPS->addName($i, $newName);
}
$a++;
}
$b++;
}
//$RPS->printArray();
所以,你得到的'1,2,3,0,0'輸出?那會很奇怪,很難相信。 – 2010-12-16 10:37:41
您有效地爲每個'$ moreSomehting'調用'$ object-> addStuff($ i,$ moreSomething);'三次,每次使用不同的'$ i'。也許你的邏輯錯了。你想實現什麼? – 2010-12-16 10:47:25
你能展示一下'addStuff'在做什麼嗎? – 2010-12-16 11:02:32