在数组初始化器中有条件地插入键值对

时间:2018-06-27 15:23:13

标签: php arrays

我有以下代码:

render_array(array(
    "weekdayRate" => 100,
    "weekendRate" => 200,
    "overrides"   => $overrides,
    "taxPercent"  => 11.0
));

在某些情况下,$overrides变量可以是一个空数组,为null或false。在这种情况下是否可以完全省略密钥?

我知道我可以简单地创建一个数组变量并手动设置所需的键,但是我正在寻找一种更简单的方法。

5 个答案:

答案 0 :(得分:3)

不,您不能仅仅因为其值是false来阻止PHP查看该键。您必须将其过滤掉。您只需array_filter(),然后再将数组传递到render_array()

render_array(array_filter([
    "weekdayRate" => 100,
    "weekendRate" => 200,
    "overrides" => $overrides,
    "taxPercent" => 11.0
]));

这将删除所有具有虚假值的键。参见this demo

如果只想删除overrides键,但允许其他键使用假值,则可以按如下方式在array_filter()上使用可选的回调,并指定ARRAY_FILTER_USE_BOTH常量:< / p>

array_filter([
    "weekdayRate" => 100,
    "weekendRate" => 200,
    "overrides" => $overrides,
    "taxPercent" => 11.0
], function($v, $k) {
    if ($k == 'overrides' && !$v) {
        return false;
    }
    return true;
}, ARRAY_FILTER_USE_BOTH);

See demo(通知taxPercent是虚假的,但没有被删除,而overrides却是。)


或者,您可以只检查$overrides的值是否正确,并手动设置密钥:

$arr = [
  "weekdayRate" => 100,
  "weekendRate" => 200,
  "taxPercent" => 11.0
];

if ($overrides) {
    $arr['overrides'] = $overrides;
}

render_array($arr);

答案 1 :(得分:1)

render_array(array_filter(array(
    "sun" => 100,
    "mon" => 100,
    "tue" => 100,
    "wed" => 100,
    "thu" => 100,
    "fri" => 100,
    "sat" => 100,
    "overrides" => $overrides,
    "markup" => 11.0
), function($v) {
    if ($v) {
        return true;
    }

    return false;
}))

答案 2 :(得分:0)

可能:是

在分配之前检查您的条件,例如:

$arr = array(
 "sun" => 100,
 "mon" => 100,
 "tue" => 100,
 "wed" => 100
 "thu" => 100,
 "fri" => 100,
 "sat" => 100,
 "markup" => 11.0
);
if ($overrides)
    $arr["overrides"] = $overrides;
render_array($arr);

答案 3 :(得分:0)

虽然不完全是您的要求

  

有条件地在数组初始化器中插入一个键值对

我会这样实现的:

$var = array(
    "sun" => 100,
    "mon" => 100,
    "tue" => 100,
    "wed" => 100
    "thu" => 100,
    "fri" => 100,
    "sat" => 100,
    "markup" => 11.0
);
if (!empty($overrides)) {
    $var['overrides'] = $overrides;
}
render_array($var);

答案 4 :(得分:0)

我最终使用了array union operator。注意三元运算符周围的括号:

render_array(array(
    "weekdayRate" => 100,
    "weekendRate" => 200
) + ($overrides
        ? array("overrides" => $overrides)
        : array()
) + array(
    "taxPercent" => 11.0
));

这也保留了键的顺序(这是我在OP中未提及的要求)。