【问题标题】:Modify array recursively in PHP在 PHP 中递归修改数组
【发布时间】:2018-07-06 00:49:37
【问题描述】:

我正在尝试修改 PHP 5 函数中的数组。

示例输入:

array('name' => 'somename', 'products' => stdClass::__set_state(array()))

预期输出:

array('name' => 'somename', 'products' => null)

我编写了以下代码来将空对象(即 stdClass::__set_state(array()) 对象)替换为 null。该方法工作正常(我使用了一些调试日志来检查),但我给它的数组没有改变。

private function replaceEmptyObjectsWithNull(&$argument){
    if (is_array($argument)){
        foreach ($argument as $innerArgument) {
            $this->replaceEmptyObjectsWithNull($innerArgument);
        }
    } else if (is_object($argument)){
        if (empty((array) $argument)) {
            // If object is an empty object, make it null.
            $argument = null;
            \Log::debug("Changed an empty object to null"); // Is printed many times, as expected.
            \Log::debug($argument); // Prints an empty line, as expected.
        } else {
            foreach ($argument as $innerArgument) {
                $this->replaceEmptyObjectsWithNull($innerArgument);
            }
        }
    }
}

我这样称呼这个方法:

$this->replaceEmptyObjectsWithNull($myArray);
\Log::debug($myArray); // myArray should be modified, but it's not.

我在这里做错了什么?我是通过引用来解析参数的,对吧?

【问题讨论】:

  • foreach ($argument as $innerArgument) 更改为foreach ($argument as &$innerArgument)。这样$innerArgument 是参考而不是副本。
  • 谢谢!这正是我需要的,太棒了!

标签: php arrays recursion pass-by-reference


【解决方案1】:

有一个非常简单的方法可以做到这一点。

您只需更改您的 foreach 循环以引用您的变量,并且使用您的变量的副本。您可以使用 $innerArgument 前面的 & 符号来执行此操作。

foreach ($argument as &$innerArgument) {
    $this->replaceEmptyObjectsWithNull($innerArgument);
} 

注意循环中$innerArgument 前面的& 符号。

您可以了解更多关于此in the PHP docs 的信息。您还可以了解更多关于一般参考的信息in the PHP docs

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 2015-09-05
    • 2016-01-22
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多