使用关联、查找/映射数组替换平面数组中的值

问题描述 投票:0回答:4

这应该是一个简单的衬里,但我不太明白:

我有一个像这样的数组:

$a = ["z", "x", "y"];

还有一个像这样的数组:

$b = ["x"=>"a", "y"=>"b", "z"=>"c"];

什么是 php oneliner 来获取:

$c = ["c", "a", "b"];

我想使用 a 的每个元素来索引 b 并返回结果数组 我一直在查看 array_map 但不知道如何将 b 绑定到回调函数。

php arrays replace mapping lookup
4个回答
2
投票
$c = array_merge(array_intersect_key(array_flip($a), $b), $b);
$c = array_values($c);

不是真正的一句台词,但很接近:P


2
投票
$c = array();
foreach ($a as $key => $value)
{
    if (isset($b[$value]))
    {
       $c[] = $b[$value];
    }
}

1
投票

这是我在@onetrickpony的帮助下最终得到的解决方案:

$a = array("z", "x", "y");
$b = array("x"=>"a", "y"=>"b", "z"=>"c");

$c = array_map(function($key) use ($b){ return $b[$key]; }, $a);

关键是使用“use”关键字将关联数组绑定到闭包。 一旦你知道你在寻找什么,就很简单了:-)


1
投票

使用现代 PHP,您可以使用箭头函数语法来访问第二个数组,而无需

use()
。当您迭代第一个数组中的所有值时,请检查映射/第二个数组中是否有匹配的键。如果找到匹配项,则使用它;否则使用空合并运算符回退到原始值。

代码:(演示

var_export(
    array_map(
        fn($v) => $b[$v] ?? $v,
        $a
    )
);

对于询问者的原始数组,所有元素都被映射,因此不需要空合并——这只是覆盖查找数组中缺少键的类似问题的一种方法。

如果查找数组可能包含

null
值,那么您需要使用
key_exists()
像这样

© www.soinside.com 2019 - 2024. All rights reserved.