有条件地将关联元素添加到数组

问题描述 投票:0回答:9

如何在 array() 语句中有条件地将

'b' =>  'xyz'
添加到下面的数组中?

$arr = array('a' => abc)

三元运算符不让我这样做。

php arrays conditional-statements associative-array conditional-operator
9个回答
21
投票

PHP 8.1 中,您可以通过数组解包来完成此操作:

$arr = [
    'foo' => 'bar', 
    ...($condition ? ['baz' => 'boo' ] : []),
];

参见https://php.watch/versions/8.1/spread-operator-string-array-keys


13
投票
$a = array('a' => 'abc') + ($condition ? array('b' => 'xyz') : array());

9
投票

这是一个老问题,但您可以使用 array_merge 来完成此操作:

array_merge(['foo' => 'bar'], $condition ? ['baz' => 'boo' ] : []);

7
投票

您需要两个步骤:

$arr = array('a' => 'abc');

if(condition) {
    $arr['b'] = 'xyz';
}

2
投票
$arr = array('a' => 'abc');
if ($condition_required_for_b_to_be_put_in_the_array) {
   $arr['b'] = 'xyz';
}

如果您真的想使用三元运算符:

$arr = array('a' => 'abc', $condition ? 'b' : '' => $condition ? 'xyz' : '');
$arr = array_filter($arr);

1
投票

不确定你在问什么;为什么不呢

if (condition) { 
   $arr['b'] = 'xyz';
}

0
投票

三元的意思是三项。 你必须有一个条件,一个真实的部分,一个虚假的部分。 它取代了 if 条件 then true 部分 else false 部分。 你不能省略第三部分。 5.3 中有一个快捷方式,如果条件也可以用作真实部分,但它仍然有三个术语,则允许您省略真实部分。


0
投票

array_merge()
array_replace()
、“数组联合运算符”和数组解包都是将关联元素添加到关联数组的潜在合适工具。

请注意,如果关联数组具有数字键,则在将数组连接在一起时可能存在覆盖元素的风险。

这里演示了上述技术,以及它们如何根据原始数组的顺序和考虑到键冲突的影响有条件添加的元素来影响输出。 演示

输入:

$arr = ['a' => 'abc'];
$add = ['b' => 'bar', 'a' => 'foo'];

echo json_encode(array_merge($arr, count($add) > 1 ? $add : []));
// {"a":"foo","b":"bar"}

echo json_encode(array_replace($arr, count($add) > 1 ? $add : []));
// {"a":"foo","b":"bar"}

echo "\n---\n";

echo json_encode($arr + (count($add) > 1 ? $add : []));
// {"a":"abc","b":"bar"}    

echo json_encode((count($add) > 1 ? $add : []) + $arr);
// {"b":"bar","a":"foo"}    

echo json_encode([...$arr, ...count($add) > 1 ? $add : []]);
// {"a":"foo","b":"bar"}

echo json_encode([...count($add) > 1 ? $add : [], ...$arr]);
// {"b":"bar","a":"abc"}

0
投票

为什么不用函数来实现呢?

public function maybe_add_to_array( array &$arr, string $key, $value ) {
    if (!$value){
        return;
    }
    $arr[ $key ] = $value;
}
© www.soinside.com 2019 - 2024. All rights reserved.