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' );

そして、次のような可変長の2番目の配列があります

 $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キーではなく、値。値が一意になることはあまりないため、配列の反転はできません。したがって、配列の反転によりデータが失われます。

どんな助けでも大歓迎です。

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

ラムダ関数を使用したクリーン バージョン:

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