【问题标题】:Modifying an array sub-value that has been returned by a function修改函数返回的数组子值
【发布时间】:2014-04-21 06:37:48
【问题描述】:

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

我想出了以下解决方案:

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

这可以吗?如果是,如何?如果没有 - 为什么不呢?

【问题讨论】:

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


    【解决方案1】:

    您缺少两个 & 符号...这一行中的一个:

    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

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多