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

v7pvogib  于 2022-12-21  发布在  PHP
关注(0)|答案(5)|浏览(119)

我有一个数组:

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

另一个数组是:

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

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

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

gcxthw6b1#

迭代$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)
}
mu0hgdu0

mu0hgdu02#

由于您希望结果序列遵循$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);
1l5u6lss

1l5u6lss3#

编写自定义脚本

$result = [];
foreach($a as $key => $value) $result[trim($key, 'g')] = $value;
foreach($list as $key) if (!isset($result[strval($key)]) $result[strval($key)] = null;
yk9xbfzb

yk9xbfzb4#

1.循环$list数组
1.检查列表值(前缀为g)是否存在于$a数组中,如果存在,则用所需的数字键将其压入结果数组中;如果没有,则将其推入具有所需数字键和默认值null的备用数组中。
1.完成迭代后,将替代数组中的数据追加到结果数组中。
这将正确地过滤您的数据,应用预期的默认值,并完全按照请求对输出进行排序。
代码:(Demo

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

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

gdrx4gfi

gdrx4gfi5#

看起来你首先要做的是转换数组$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);

相关问题