通过键的后缀PHP合并数组

时间:2018-05-18 20:12:34

标签: php arrays merge associative-array

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

$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
);

3 个答案:

答案 0 :(得分:4)

如果您知道两个数组的大小相同且顺序相同,则可以将array_combinearray_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。如果要将任何值发送到数据库,请确保将预准备语句与占位符一起使用。