【问题标题】:Nested foreach loops, PHP, how do I manipulate the values?嵌套的 foreach 循环,PHP,我如何操作这些值?
【发布时间】:2013-07-02 22:00:13
【问题描述】:
foreach ($bing_array as $bing_array_val)
{       
    foreach ($final_array as $final_array_val)
    {
        if ($final_array_val["link"] == $bing_array_val["link"])
        {

            $final_array_val["rank"] += $bing_array_val["rank"];
        }
    }
}

上面的代码有两个foreach循环,是嵌套的。

它应该针对每个 final_array["link"] 测试每个 bing_array["link"],如果它们相同,则 final_array["rank"] 值应该是 += bing_array["rank"] 但是当我回显时final_array,["rank"] 值不变。

我认为这是一个语法问题,我哪里出错了?

谢谢

【问题讨论】:

  • 告诉我们$bing_array和$final_array。

标签: php foreach associative-array


【解决方案1】:

您需要使用参考语法(& 前缀):

foreach ($final_array as &$final_array_val)
{
}
unset($final_array_val);

请注意,unset 是中断对最后一个值的引用所必需的。阅读更多here。

【讨论】:

  • 哇,很多回声语句我不需要它,但它现在可以用于操作!操作引用的数组而不是打印它时是否需要这样做?我从 C++ 中识别 &
  • 只有在要修改值时才需要它。请注意,我不建议您为bing_array 这样做,因为您没有修改它。
  • 谢谢,看到父 foreach 会多次调用子 foreach,并且可能会多次创建和取消设置引用变量,我应该在父 foreach 循环之后而不是在子 foreach 之后立即取消设置吗?谢谢!
  • 您只需要在外循环之后执行一次。该变量一次只能指向一个位置,因此如果您只是要再次设置它,则无需取消设置它。但它不会受伤。当一个值被立即清理时,阅读代码通常会更清晰。
  • 是的,你可以。这是我讨厌 PHP 的一件事 - 能够创建一个在创建它的范围块之外持续存在的新变量。我来自 C 和 C++ 背景,所以我仍然在我想要的范围级别定义变量(ie 在循环之前)。这让任何读者都清楚我打算在循环之外使用该变量。这也是一种很好的做法,以防万一您的数组为空并且您从不循环。你仍然可以保证变量有一个值,你不必使用isset。
【解决方案2】:

这是您需要的实际代码:

foreach ($bing_array as &$bing_array_val)
{       
    foreach ($final_array as &$final_array_val)
    {
        if ($final_array_val["link"] == $bing_array_val["link"])
        {
            $final_array_val["rank"] += $bing_array_val["rank"];
        }
    }
    unset(&$final_array_val);
}
unset(&$bing_array_val);

在您的初始代码中,每次在 $final_array 上循环时,它都会创建一个名为 $final_array_val 的临时值,其中包含内容。然后,您对其进行了修改,然后每次出现 foreach 时都将其替换。

通过引用传递变量,而不是在 foreach 中创建新的临时变量,您可以使用实际变量来保留您对其所做的修改。

【讨论】:

  • 非常感谢,我能够用@paddy 的回答破解它,但这就是我所做的,谢谢!我了解 C++ 中的引用变量,因此可以继续!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2015-07-06
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
相关资源
最近更新 更多