修改函数返回的数组子值


Modifying an array sub-value that has been returned by a function

我需要一个函数,递归地解析多维数组中某个字符串值的一部分,如果找到,则返回字符串所包含的整个值。

我想出了下面的解决方案:

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