0

以下を実行すると'B.C.'、 が得られますが、取得しようとしています'BC'

厳密な比較を行うように設定array_searchしましたが、返されないのはなぜ"BC"ですか?

を渡すと、正しい が"Alberta"得られます。"AB"

<?
function cleanProvince($province)
{
    $values = array(
        'AB' => 'Alberta',
        'BC' => 'B.C.',
        'BC' => 'British Columbia',
        'ON' => 'Ontario',
        'ON' => 'Onatrio',
        'ON' => 'Ont',
        'NS' => 'Nova Scotia',
        'QC' => 'Quebec'
    );
    if ($key = array_search(@$province, $values, true)) {
        return $key;
    } else {
        return $province;
    }
}
echo (cleanProvince("B.C."));
?>
4

2 に答える 2

7

1 つの配列に複数のキーを含めることはできません。これを行うと、2 番目が最初のものをオーバーライドします。

$values = array(
    'AB'=>'Alberta',
    'BC'=>'B.C.',
    'BC'=>'British Columbia', # Overrides 'B.C.'
    'ON'=>'Ontario',
    'ON'=>'Onatrio', # Overrides 'Ontario'
    'ON'=>'Ont', # Overrides 'Onatrio'
    'NS'=>'Nova Scotia',
    'QC'=>'Quebec',
);

に渡し"B.C."ていcleanProvinceます。それは にない$valuesので、 をarray_search返します。falseしたがって、 をcleanProvince返します"B.C."

于 2012-05-25T18:48:18.153 に答える
1

推奨されているように、キーと値を交換すると望ましい結果が得られ、array_search()かなり高いオーバーヘッドがあるとしか思えない呼び出しを回避できます (ほとんどの場合、問題点ですが、繰り返し呼び出される場合は... )。

function getProvince($name){
    $values = array(
        'Onatrio' => 'ON',
        'Ontaroi' => 'ON',
        'O.N.' => 'ON',
        // ...
    );
    return isset($values[$name]) 
        ? $values[$name] 
        : $name; // or null I suppose
}
于 2012-05-25T19:06:34.573 に答える