我正在循环使用XML并从中收集数据。有些值需要翻译,所以我创建了一个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);
}
答案 0 :(得分:4)
更改您的功能签名以获取值by reference:
function checkTranslation(&$foo) { /* ... */ }
为什么?
当你将某个东西传递给一个函数时,该变量的值(一个副本,可以这么说)将被传入。无论你在函数内部对它做什么都不会反映到该函数之外的原始变量。 / p>
但是,如果在函数签名中的参数前面添加&
,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
。这似乎没有多大意义。