PHP使用数组值匹配另一个数组的键,然后将值提取到新数组中

PHP使用数组值匹配另一个数组的键,然后将值提取到新数组中,php,arrays,Php,Arrays,我可以通过foreach循环轻松地完成这项工作,并将其推入一个新数组 $encoding = [0 => 'X', 1 => 'K', 2 => 'L', 3 => 'R', 4 => 'B']; $digits = [1, 1, 4, 2]; // result should then equal ['K', 'K', 'B', 'L'] 但是我找不到php中是否内置了一个函数来处理这个问题,或者是否有一个助手函数库可以处理这个问题 我还希望它能够进行反转,

我可以通过foreach循环轻松地完成这项工作,并将其推入一个新数组

$encoding = [0 => 'X', 1 => 'K', 2 => 'L', 3 => 'R', 4 => 'B'];

$digits = [1, 1, 4, 2];

// result should then equal ['K', 'K', 'B', 'L']
但是我找不到php中是否内置了一个函数来处理这个问题,或者是否有一个助手函数库可以处理这个问题

我还希望它能够进行反转,并将值解码回其数字。

一种可能性是使用数组映射:

输出:

$encoded = array_map(function ($v) use ($encoding) { return $encoding[$v]; }, $value);
$encoding_f = array_flip($encoding);
$decoded = array_map(function ($v) use ($encoding_f) { return $encoding_f[$v];}, $encoded);
要解码结果,可以再次使用array_map,这次使用array_search查找要返回的适当键值:

Array ( [0] => K [1] => K [2] => B [3] => L )
或者正如@Barmar所建议的,可能更有效:

$decoded = array_map(function ($v) use ($encoding) { return array_search($v, $encoding);}, $encoded);
输出:

$encoded = array_map(function ($v) use ($encoding) { return $encoding[$v]; }, $value);
$encoding_f = array_flip($encoding);
$decoded = array_map(function ($v) use ($encoding_f) { return $encoding_f[$v];}, $encoded);

可能array_intersect?无法使其工作,因为键有重复项。您还将如何执行此操作的相反操作来解码值?@robertmylne使用array_flip反转编码数组。不要在回调函数中调用array_flip,请在映射之前执行一次。@Barmar done。我想保持一条直线,但这显然更好。