我需要一个函数,递归地解析多维数组中某个字符串值的一部分,如果找到,则返回字符串所包含的整个值。
我想出了下面的解决方案:
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
作为引用,并返回函数的结果作为一个。
这能做到吗?如果是,怎么做?如果不是,为什么不呢?
您缺少两个&号…这一行的一个:
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