按键的后缀合并数组PHP

bmp9r5qi  于 2023-04-04  发布在  PHP
关注(0)|答案(4)|浏览(97)

我有两个数组,我想合并为一个根据键后缀。

$keys = array(
  'staff_first_name' => NULL,
  'staff_last_name' => NULL,
  'staff_years' => NULL
);

$submitted_values = array( 
   'first_name' => 'jon',
   'last_name' => 'doe',
   'years' => 5
);

我知道我可以使用像here这样的函数并修改它。
但是有没有一个原生的php函数可以完成这一点。我试图使用array_merge_recursive,但是在查看了文档之后,它不会做我需要它做的事情。

$wanted_array = array(
   'staff_first_name' => 'jon',
   'staff_last_name' => 'doe',
   'staff_years' => 5
);
mqkwyuun

mqkwyuun1#

如果你知道这两个数组大小相同,顺序相同,你可以将array_combinearray_keys一起使用。

$wanted_array = array_combine(array_keys($keys), $submitted_values);
7dl7o3gd

7dl7o3gd2#

因为它是一个后缀,是相同的每个关键,我们不需要担心它。
如果我们对数组进行ksort排序,它们的排序应该相同,因为所有键数组的后缀都相同。

$keys = array(
   'staff_first_name' => NULL,
   'staff_last_name' => NULL,
   'staff_years' => NULL
);

$values = array( 
    'years' => 5,
    'first_name' => 'jon',
    'last_name' => 'doe',
);

ksort($values);
ksort($keys);
Var_dump(array_combine(array_keys($keys), $values));

我故意把几年放在第一位,以证明它是有效的。
https://3v4l.org/cBNhk
如果你需要将$_POST减少到只有这些数组项才能合并它们,你可以使用preg_grep、array_flip、array_values和array_intersect_key的组合来从数组中筛选出想要的项。

$val = preg_grep("/first_name|last_name|years/",array_values(array_flip($values)));

$values = Array_intersect_key($values, array_flip($val));
ksort($values);
ksort($keys);
Var_dump(array_combine(array_keys($keys), $values));

我添加了一些额外的项来模拟一个更大的混合$_POST数组。
https://3v4l.org/a3ju1

zwghvu4y

zwghvu4y3#

这是其中一个问题,我必须恳求OP重新考虑他们的过程。它只会使您的代码复杂化,以引入关联键,而不会立即与表单字段名称同步。这是我能给予你的最好建议:声明键的白名单并为每个键分配默认值,然后过滤,然后替换。
因为你的值都是null,所以你的代码可以通过调用array_fill_keys()变得更加DRY。
下面的代码可以写成一行代码,但为了显示每一步,我在每次函数调用后都将数组打印到屏幕上。
代码:(Demo

$defaults = array_fill_keys(['first_name', 'last_name', 'years'], null);
var_export($defaults);

$_GET = [
         'last_name' => 'doe',
         'Hackers' => 'can be naughty',
         'years' => 5
        ];
var_export($_GET);

$screened = array_intersect_key($_GET, $defaults);
var_export($screened);

$replaced = array_replace($defaults, $screened);
var_export($replaced);

输出:

array (
  'first_name' => NULL,
  'last_name' => NULL,
  'years' => NULL,
)array (
  'last_name' => 'doe',
  'Hackers' => 'can be naughty',
  'years' => 5,
)array (
  'last_name' => 'doe',
  'years' => 5,
)array (
  'first_name' => NULL,
  'last_name' => 'doe',
  'years' => 5,
)

... p.s.确保在将任何值发送到数据库时使用带占位符的预处理语句。

9lowa7mx

9lowa7mx4#

如果数据量不一致或元素顺序不一致,则使用array_combine()很容易受到破坏。
为了获得更高的可靠性,可以使用键Map作为两个数组之间的适配器。
如果在目标元素处不存在所寻求的值,则将保留初始null值。
代码:(Demo

$keyMap = [
   'staff_first_name' => 'first_name',
   'staff_last_name' => 'last_name',
   'staff_years' => 'years'
];

foreach ($keys as $key => &$value) {
    $value = $submitted_values[$keyMap[$key] ?? ''] ?? $value;
}
var_export($keys);

如果没有键Map,您可以简单地从键中删除前缀来访问提交的元素。Demo

foreach ($keys as $key => &$value) {
    $value = $submitted_values[substr($key, 6)] ?? $value;
}
var_export($keys);

相关问题