array_replace_recursive将值保存为具有空值的键

时间:2014-01-02 03:58:02

标签: php

我使用此函数就像你在我的控制器中使用angular.extend()或$ .extend()一样。

function extend($base = array(), $replacements = array())
{
    $base = !is_array($base) ? array() : $base;
    $replacements = !is_array($replacements) ? array() : $replacements;

    return array_replace_recursive($base, $replacements);
}

标准用途:

$inputs = extend([
  'name' => 'test',
  'empty'
], getInputs());
// getInputs() grabs the data from a form encoded or json body request.

我希望empty成为一个键,以便稍后我可以将此数组与Laravel模型或其他对象一起使用。

我明白了:

[
  [name] => 'test',
  [0] => 'empty'
]

我想:

[
  [name] => 'test',
  [empty] => null
]

这应输出: OK(1次测试,2次断言)

public function testInputs()
{
    $inputs = \Api::inputs([
        'name' => 'test',
        'empty'
    ]);

    $this->assertArrayHasKey('name', $inputs);
    $this->assertArrayHasKey('empty', $inputs);
}

有没有本地方式可以做到这一点,还是我会自己动手?

1 个答案:

答案 0 :(得分:2)

在PHP中,数组中的非关联元素被视为具有自动整数键的关联数组的值。 The documentation州:

  

密钥是可选的。如果没有指定,PHP将使用   以前使用的最大整数键的增量。

这意味着['abc', 'def'][0 => 'abc', 1 => 'def']相同。

如果您希望函数使用值作为键,则无法区分实际使用键的整数的数组与PHP因缺少键而自动分配的数组。

我个人认为更改函数的输入更容易,因此格式正确:['name' => 'test', 'empty' => null]

如果这不是一个选项,并且您知道您收到的值将永远不会有数字作为键,您需要将您的功能更改为以下内容:

function extend($base, $replacements) {
    $base = !is_array($base) ? array() : $base;
    $replacements = !is_array($replacements) ? array() : $replacements;

    $ret = array();
    foreach ($base as $key => $val) {
        if (is_int($key)) { // value without key
            $ret[$val] = null;
        } else {
            $ret[$key] = $val;
        }
    }

    return array_replace_recursive($ret, $replacements);        
}