我有两个数组,我想根据键后缀合并为一个。
$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
);
答案 0 :(得分:4)
如果您知道两个数组的大小相同且顺序相同,则可以将array_combine
与array_keys
一起使用。
$wanted_array = array_combine(array_keys($keys), $submitted_values);
答案 1 :(得分:3)
因为它是每个键上相同的后缀,所以我们不必担心它。
如果我们对数组进行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
答案 2 :(得分:1)
这是我必须恳求OP重新考虑他们的过程的问题之一。它只会使您的代码复杂化,以引入不会立即与您的表单字段名称同步的关联键。这是我可以给你的最佳建议:声明密钥的白名单并为每个分配默认值,然后过滤,然后替换。
由于您的所有值均为> "/c/Program Files/nodejs/node.exe" nodetest.js
The system cannot find the path specified.
,因此可以通过调用null
使您的代码更加干净。
以下内容可以写成一行代码,但为了显示每一步,我在每次函数调用后都将数组打印到屏幕上。
代码:(Demo)
array_fill_keys()
输出:
$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);
... P.S。如果要将任何值发送到数据库,请确保将预准备语句与占位符一起使用。