用PHP在没有foreach的情况下通过键准备数组的最佳方法



我正试图创建一个函数,通过键掩码从属性的主数组中返回一个新数组。

就像:

客户端

$preparedParams = $request->prepareParams([
'name',
'price',
'description',
'tags',
], $request->params());

$request->params((-返回类似下面的数组

[
'name' => 'iPhone',
'price' => 123,
'description' => 'Some desc',
'action' => 'add',
'page' => 'product',
'etc...' => '...',
]

需要

$newProduct = new ModelProduct();
$newProduct->set($preparedParams);
$newProduct->save();

更简单的解决方案

public function prepareParams(array $keys, array $values): array
{
$result = [];
foreach($keys as $key) {
$result[$key] = $values[$key] ?? null;
}
return $result;
}

需要包括密钥掩码中的所有参数的方法,包括NULL也包括

第二种解决方案(可能更好?(

我试过在没有前臂的情况下做这件事,但不确定这是最好的方法。

public function prepareParams(array $keys, array $values): array
{
return array_merge(
$filledByKeys = array_fill_keys($keys, null),
array_intersect_key($values, $filledByKeys)
);
}

正如您所看到的,我们创建了带有键的空数组(这是merge的第一个参数(。然后使用intersect-by-key获取包含值中的props的数组(这是merge的第二个参数(。并将其与NULL键合并。

但你能告诉我更好的方法吗?

谢谢!

这个怎么样?循环是";隐藏的";按array_map;(

编辑:哦。。。那有点不对。。我会改正的edit2:根据要求更新。

$keys = [
'name',
'price',
'description',
'tags',
];
$src = [
'name' => 'iPhone',
'price' => 123,
'description' => 'Some desc',
'action' => 'add',
'page' => 'product',
'etc...' => '...',
];
$result = [];
array_map(function($key, $key2, $val) use (&$result) {
if ($key == $key2) {
$result[ $key ] = $val;
}
elseif($key != null) {
$result[ $key ] = null;
}
}, $keys, array_keys($src), array_values($src));
var_dump($result);

输出:

array(4) {
["name"]=>
string(6) "iPhone"
["price"]=>
int(123)
["description"]=>
string(9) "Some desc"
["tags"]=>
NULL
}

它符合你的要求吗?

最新更新