array_search的问题

时间:2012-05-25 18:45:55

标签: php

当我运行以下内容时,我得到'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."));
?>

2 个答案:

答案 0 :(得分: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."

答案 1 :(得分: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
}