通过部分键匹配合并关联数组



我有一个数组:

$a = [
"g41" => 1,
"g44" => 2,
"g53" => 3
];

另一个阵列是:

$list = [
40,
41,
44,
46,
53
];

如何通过部分键匹配来组合这些数组以产生以下结果?

$result = [
"41" => 1,
"44" => 2,
"53" => 3,
"40" => null,
"46" => null
];

迭代$list数组并检查另一个$a数组中的密钥:

$a = array("g41" => 1, "g44" => 2, "g53" => 3);
$list = array(40, 41, 44, 46, 53);
$result = [];
foreach ($list as $key) {
$result[$key] = $a["g$key"] ?? null;
}
var_dump($result);

输出:

array(5) {
[40]=> NULL
[41]=> int(1)
[44]=> int(2)
[46]=> NULL
[53]=> int(3)
}

由于您希望结果序列遵循$a,您可能需要取消设置$list,并将剩余列表推送到$result

示例代码如下:

<?php
$a=["g41"=>1,"g44"=>2,"g53"=>3];
$list=[40,41,44,46,53];
$result =[];
foreach($a as $key => $value){
$new_key = substr($key,1); //remove first character, if only you first key always single char, else you may use your own method to extract key
if(in_array($new_key,$list)){
$result[$new_key] = $value;
unset($list[array_search($new_key, $list)]);//remove used key
}
}
//push remaining as null
foreach($list as $v){
$result[$v] = null;
}
print_r($result);

编写自定义脚本

$result = [];
foreach($a as $key => $value) $result[trim($key, 'g')] = $value;
foreach($list as $key) if (!isset($result[strval($key)]) $result[strval($key)] = null;
  1. 循环$list数组
  2. 检查列表值(以g开头(是否存在于$a数组中。如果是,请使用所需的数字键将其推入结果数组;如果没有,请使用所需的数字键和默认值null将其推送到一个替代数组中
  3. 迭代完成后,将替代数组中的数据附加到结果数组中

这将正确过滤数据,应用预期的默认值,并根据请求对输出进行排序。

代码:(演示(

foreach ($list as $v) {
if (isset($a["g$v"])) {
$result[$v] = $a["g$v"];
} else {
$extra[$v] = null;
}
}
var_export(
array_replace($result ?? [], $extra ?? [])
);

我使用?? []回退到一个空数组,以防其中任何一个数组从未声明(从未接收任何元素(。

看起来您首先要做的是转换数组$a中的键。然后使用键的$list来填充$a中不存在的空值。

$aKeys = preg_replace('/D/', '', array_keys($a));
$a = array_combine($aKeys, $a);
$defaultList = array_fill_keys($list, null);
$list = array_merge($defaultList, $a);

最新更新