过滤 Laravel 集合以仅保留白名单密钥

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

我想使用允许的密钥白名单来清理请求负载的关联元素。

我的

$request
看起来像:

{"input1":"50","input2":"0","input3":"60000"}

我的白名单

$validkeys
:

{"input1","input2","input3","input4","input5"}

如果我使用

only()
,我会得到
null
默认值,其中请求负载没有对应的值。

$request->only($validkeys)

毫无帮助地变成:

{"input1":"50", "input2":"0", "input3":"60000", "input4":null, "input5":null}`

如果我调用

intersect()
,松散比较会删除具有
0
值的元素。

$request->intersect($validkeys)

毫无帮助地变成:

{"input1":"50", "input3":"60000"}`

我想要的只是

$request
和验证。

php arrays laravel collections filtering
5个回答
2
投票

我觉得这个更短。

$validated = array_intersect_key($request->all(), array_flip($validkeys));


1
投票

这可能对您的情况有所帮助。此代码使用 Request

only
方法获取请求密钥,然后将其放入集合中,使用
$value !== null
对其进行过滤,以便
0
应该仍然存在。

// Put request values into collection
$valid = collect($request->only('input1', 'input2', 'input3'));

// Filter values
$valid = $valid->filter(function ($value) {
    return $value !== null;
});

// We get it back as an array
$valid = $valid->all();

0
投票

实现此目的的另一种方法是:

$requestValidKeys = $request->keys()->intersect($validkeys);
$requestValid = $request->only($requestValidKeys);

所以基本上你只与键相交。使用这些有效的密钥,您可以调用

only()


0
投票

另一种选择是使用集合来过滤

$request
,这可以使读取比数组翻转/相交更清晰一些:

collect($request->all())->filter(function ($_, $key) {
    return collect($validKeys)->contains($key);
});

0
投票

显然最新版本的 Laravel (11) 已经实现了

only()
以避免在输出中添加空值。我不知道这个变化是什么时候发生的,但现在已经修复了。

代码:(PHPize演示

$collection = collect([
    "input1" => "50",
    "input2" => "0",
    "input3" => "60000",
    "input6" => "777",
]);

var_export(
    $collection->only(["input1" , "input2" , "input3", "input4", "input5"])
);

输出:

\Illuminate\Support\Collection::__set_state(array(
   'items' => 
  array (
    'input1' => '50',
    'input2' => '0',
    'input3' => '60000',
  ),
   'escapeWhenCastingToString' => false,
))
© www.soinside.com 2019 - 2024. All rights reserved.