我需要一个递归地为某个字符串值的(部分)解析多维数组的函数,如果找到,则返回包含该字符串的整个值。
我提出了以下解决方案:
function & ransackArray(array & $haystack, $needle) {
foreach($haystack as &$element) {
if(is_array($element)){
if($v=ransackArray($element, $needle))
return $v;
} else {
if(strstr($element, $needle))
return $element;
}
}
return false;
}
这很好用。例如,提供:
$data=array(
'key' => 'something',
'children' => array(
'someValue' => 'myTest',
'someMore' => 'yes'
)
);
跑步:
$r=ransackArray($data, 'myTes');
这将导致$r
包含'myTest'。
问题是,现在我发现了这个值,我想通过写一下,在$data
中随时改变它:
$r='new value';
这应该有效地导致数据看起来像这样:
$data=array(
'key' => 'something',
'children' => array(
'someValue' => 'new value',
'someMore' => 'yes'
)
);
然而,这似乎不起作用。也许我误解了一些关于引用的东西。在任何情况下,我需要这个工作的原因是为什么我将$haystack
作为参考传递,并将函数的结果作为一个返回。
可以这样做吗?如果有,怎么样?如果没有 - 为什么不呢?
答案 0 :(得分:2)
你错过了两个&符号......一行在这一行:
if($v = self::ransackArray($element, $needle))
应该是:
if($v = &self::ransackArray($element, $needle))
和一行:
$r = ransackArray($data, 'myTes');
应该是:
$r = &ransackArray($data, 'myTes');
(注意:看起来你的ransackArray
函数实际上是一个类中的方法,所以如果你从类中调用那个方法,它将是$r = &$this->ransackArray($data, 'myTes');
)
将变量传递给函数时,您不需要使用&
- 只需将&
放在函数签名中的参数前面 - 但是像你这样的情况,你从函数中得到一个返回值,函数调用和函数签名中都需要&
。有关详细信息,请参阅http://www.php.net/manual/en/language.references.pass.php