我使用此函数就像你在我的控制器中使用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);
}
有没有本地方式可以做到这一点,还是我会自己动手?
答案 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);
}