修改函数返回的数组子值

时间:2014-03-15 23:13:52

标签: php arrays search multidimensional-array pass-by-reference

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

我提出了以下解决方案:

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作为参考传递,并将函数的结果作为一个返回。

可以这样做吗?如果有,怎么样?如果没有 - 为什么不呢?

1 个答案:

答案 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