【问题标题】:PHP - function not working when used inside foreachPHP - 在 foreach 中使用时函数不起作用
【发布时间】:2017-04-17 13:50:32
【问题描述】:

我正在通过 XML 循环并从中收集数据。有些值需要翻译,所以我做了一个 switch 函数,它被包裹在另一个函数中,并在每个循环中调用以检查原始值并根据 switch 中定义的新值更改它。

问题是如果我在 foreach 中包含开关,原始值得到正确更改(原始变量 $foo 的字符串被翻译)。但是,如果我将开关包装在函数中并在循环中调用该函数,那么原始值不会改变。它必须是if ($foo == 'one') $foo == 'ein'...这是我的代码:

function checkTranslation($foo) {
    switch($foo) {
        case('one'): $foo = 'ein'; break;
        case('two'): $foo = 'zwei'; break;
        ...
    }
};

foreach ($XML -> some -> data as $item) {
    $foo = $item['value'];
    checkTranslation($foo);
}

【问题讨论】:

  • 你需要从函数中return并将其赋值给外部的变量,否则在全局范围内是不可见的。或者,通过引用传递。根据这段代码,您实际上并没有使用 $foo 变量(但我认为这只是为了这个问题而被切断?)
  • 这里发生了很多事情。首先,你没有从你的函数中返回任何东西。其次,您的函数不是作用于 $foo,而是作用于 $foo 的副本。第三,您没有将函数的返回值分配给任何东西。第四,如果你是,它将被循环的每次迭代覆盖
  • @Qirel 是的,它仅用于问题。谢谢两位的帮助。

标签: php foreach switch-statement


【解决方案1】:

更改您的函数签名以获取值by reference

function checkTranslation(&$foo) { /* ... */ }

这是为什么呢?

当您将某些内容传递给函数时,该变量的值(可以说是副本)将被传递。无论您在函数内部对它做什么,都不会反映到该函数外部的原始变量。

但是,如果你在函数签名中的参数前面添加&,PHP实际上会通过引用传递它,这意味着函数将对你传入的变量进行操作. 因此,函数内所做的任何更改都将反映在函数外部,即使函数完成后也是如此。

如果您正在为这个概念而苦恼,为您传入的变量和方法签名中的变量选择不同的名称会有所帮助。这在我刚开始时帮助我解决了这个问题:

function checkTranslation(&$input) { /* ... */ } // method
checkTranslation($foo);                          // using the method

或者...

只需返回 $foo 从您的方法中,如下所示:

function checkTranslation($foo) {
    /* ... */
    return $foo;
}

然后,在外面,类似:

$foo = checkTranslation($item['value'];);

PS 1

我建议重命名函数,这样它的作用就更明显了。 checkTranslation() 听起来它会简单地检查 输入是否有效并返回 boolean 或其他一些指示性值。但是,您实际上是(试图)操纵输入,所以像 translate() 这样的东西可能更合适?

PS 2

还请注意 EatPeanutButter 在他的评论中指出的内容:目前,您在循环的每次迭代中都会覆盖 $foo。这似乎没有多大意义。

【讨论】:

  • 可能在循环中通过引用传递,并使用该值 - 因为循环内的$foo 仍然只是一个副本。
  • 谢谢@domdom,不知道参考价值。也感谢您指出命名。我每次都更改 $foo 因为每个新实例都有一个新值。有没有更好的方法来做到这一点?
  • 在没有更多上下文的情况下很难判断发生了什么(以及应该做什么)。尤其是看到您的 for 循环似乎不是您在代码中的实际循环,对吗? (例如data 而不是$data)。
  • 这个代码块很简单。我加载 xml,然后循环遍历它以从每个元素的子节点收集值。每个元素都有一个节点,该节点具有需要翻译的属性值。
  • 但是这种价值收集是如何运作的呢?你把它们存放在哪里?
猜你喜欢
  • 2020-12-27
  • 2018-08-22
  • 2017-05-21
  • 2021-03-02
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多