使用 PHP 中的嵌套输出遍历数组

walk through array with nested output in PHP

我有这个代码:

foreach ($_POST as $key1 => $item1):
    if (is_array($item1)):
        foreach ($item1 as $key2 => $item2):
            if (is_array($item2)):
                foreach ($item2 as $key3 => $item3):
                    if (is_array($item3)):
                        foreach ($item3 as $key4 => $item4):
                            $_POST[$key1][$key2][$key3][$key4] = empty($item4) ? NULL : $item4;
                        endforeach;
                    else:
                        $_POST[$key1][$key2][$key3] = empty($item3) ? NULL : $item3;
                    endif;
                endforeach;
            else:
                $_POST[$key1][$key2] = empty($item2) ? NULL : $item2;
            endif;
        endforeach;
    else:
        $_POST[$key1] = empty($item1) ? NULL : $item1;
    endif;
endforeach;

$_POST 是一个 4 级数组,array_walk() 会 return 我的数组在第一级(我不想要)。

问题是如何用重复的块简化这段代码?

这是一个递归的工作,在这里使用 array_walk_recursive 最容易实现。

尽管如此,请确保您了解代码的作用,empty returns 对于零,这可能是个问题。

$input = [
    'param1' => [
        'sub1_1' => [
            'sub1_1_1' => [
                'sub1_1_1_1' => 'foo',
                'sub1_1_1_2' => '',
                'sub1_1_1_3' => 0,
                'sub1_1_1_4' => 'bar',
                'sub1_1_1_5' => false,
                'sub1_1_1_6' => [
                    'sub1_1_1_6_1' => 'baz',
                    'sub1_1_1_6_2' => ''
                ]
            ]
        ]
    ]
];

array_walk_recursive($input, function(&$value)
{
    $value = (empty($value)) ? null:$value;
});

// Verify that false-y values were changed to null
assert($input['param1']['sub1_1']['sub1_1_1']['sub1_1_1_2']===null, 'Empty string should be normalized to null');
assert($input['param1']['sub1_1']['sub1_1_1']['sub1_1_1_3']===null, 'Zero should be normalized to null');
assert($input['param1']['sub1_1']['sub1_1_1']['sub1_1_1_5']===null, 'False should be normalized to null');

// Check out the state of the normalized input
var_dump($input);