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

一个数组中不能有多个键。当你这样做时,第二个会覆盖第一个。

$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 回答