我有一个数组:
$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;
- 循环
$list
数组 - 检查列表值(以
g
开头(是否存在于$a
数组中。如果是,请使用所需的数字键将其推入结果数组;如果没有,请使用所需的数字键和默认值null
将其推送到一个替代数组中 - 迭代完成后,将替代数组中的数据附加到结果数组中
这将正确过滤数据,应用预期的默认值,并根据请求对输出进行排序。
代码:(演示(
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);