1

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

 $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 的帖子似乎做了一些接近我想要的事情,但它比较了键,我需要比较值,而不是键。我不能进行数组翻转,因为我的值通常不会是唯一的。数组翻转会因此丢失数据。

任何帮助,将不胜感激。

4

2 回答 2

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
)
于 2013-10-03T08:57:35.667 回答
1

带有 lambda 函数的干净版本:

array_walk($data, function(&$v, $k) {
    global $modifier;
    $v = array_key_exists($v, $modifier) ? $modifier[$v] : $v;
});
于 2013-10-03T09:07:51.083 回答