使用存储在数组中的替换列表替换数组中的值

时间:2013-10-03 08:46:59

标签: php arrays

我有一个代码列表需要替换数组中的值。此过程应该保持数组中的其他元素不变。例如,我有一个如下所示的数组:

 $data=array(
'container_label_1' => '1 gallon',
'container_num_1' => '1',
'container_label_2' => '5 gallon',
'container_num_2' => '1',
'container_label_3' => '2',
'container_num_3' => '5 gallon' );

我有第二个可变长度数组,看起来像这样

 $modifier=array(
   '1 gallon'=>'1 gallon code',
   '5 gallon'=>'5 gallon code',
   '10 gallon'=>'10 gallon code'

的格式为:

label value to be replaced=>code

(在实际使用中,我在这里使用的代码值将是不包含容器大小的其他内容。)

我希望数组在完成时看起来像这样:

$data=array(
'container_label_1' => '1 gallon code',
'container_num_1' => '1',
'container_label_2' => '5 gallon code',
'container_num_2' => '1',
'container_label_3' => '2',
'container_num_3' => '5 gallon code');

它应该只修改容器标签(container_label_1,container_label_2,container_label_3等)。 $ modifier数组中的项不一定在$ data数组中,如示例所示。

似乎应该有一个相当简单的方法来实现这一点,但我只是没有想到它。我已经尝试在这里和php.net文档中查找类似的案例,我正在考虑使用array_map,但我似乎无法理解这将如何适应我的情况。我正在寻找比检查修改器数组中每个项目的每个数组项更有效的东西,因为这些数组比示例大得多。

我看到一些看起来很有希望的东西: http://www.php.net/manual/en/function.array-replace.php steelpandrummer的帖子好像做了我想要的东西,但它比较了键,我需要比较值,而不是键。我无法进行数组翻转,因为我的值通常不会是唯一的。因此,数组翻转会丢失数据。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

实际上,array_map工作正常:

$data = array(
    'container_label_1' => '1 gallon',
    'container_num_1' => '1',
    'container_label_2' => '5 gallon',
    'container_num_2' => '1',
    'container_label_3' => '2',
    'container_num_3' => '5 gallon'
);


function replaceValues($val) {
    $modifier = array(
        '1 gallon' => '1 gallon code',
        '5 gallon' => '5 gallon code',
        '10 gallon' => '10 gallon code'
    );
    return isset($modifier[$val]) ? $modifier[$val] : $val;
}

print_r(array_map('replaceValues', $data));

结果是

Array
(
    [container_label_1] => 1 gallon code
    [container_num_1] => 1
    [container_label_2] => 5 gallon code
    [container_num_2] => 1
    [container_label_3] => 2
    [container_num_3] => 5 gallon code
)

答案 1 :(得分:1)

使用lambda函数清理版本:

array_walk($data, function(&$v, $k) {
    global $modifier;
    $v = array_key_exists($v, $modifier) ? $modifier[$v] : $v;
});