Php 当北卡罗来纳州不等于北卡罗来纳州时

Php 当北卡罗来纳州不等于北卡罗来纳州时,php,arrays,character-encoding,associative-array,Php,Arrays,Character Encoding,Associative Array,这一直让我感到难以置信。我在一个站点上有一个表单,其中有一个状态输入。为了使选择更容易,我提供了一个从互联网复制的州名下拉选择,使用datalist元素,使用快速Python脚本格式化。我最初注意到一些字符出现在空白之前,但这很容易通过将编码头设置为UTF-8来解决。现在,我正在尝试用州名称的缩写替换州名称列表,以用于数据库存储,使用的数组形式为[“alabama”=>“al”,“alaska”=>“ak”…],但名称不匹配。这里有一些代码作为示例,我已经为显示的输出运行了这些代码。假设州“No

这一直让我感到难以置信。我在一个站点上有一个表单,其中有一个状态输入。为了使选择更容易,我提供了一个从互联网复制的州名下拉选择,使用datalist元素,使用快速Python脚本格式化。我最初注意到一些字符出现在空白之前,但这很容易通过将编码头设置为UTF-8来解决。现在,我正在尝试用州名称的缩写替换州名称列表,以用于数据库存储,使用的数组形式为[“alabama”=>“al”,“alaska”=>“ak”…],但名称不匹配。这里有一些代码作为示例,我已经为显示的输出运行了这些代码。假设州“North Carolina”是从下拉列表中选择的,并且self::$data['state']是从所述下拉列表中获取的,因此保存值“North Carolina”

echo self::$data['state']."\n";              // Prints stored state value
$s = strtolower(self::$data['state']);       // Stores it lowercase as $s
echo "Observe: ".$s."\n";                    // Prints it, as the dropdown value
echo "Expect:  ".array_flip($states)['nc']."\n"; // Prints the north carolina key
echo "Observed matches expected: ";
if (isset($states[$s])) {                    // If north carolina is an array key
    echo 'true';                             //   print true
} else {                                     // Otherwise
    echo 'false';                            //   print false
}
我正在检查输入(
self::$data['state']
)中的状态名是否是数组中的键。因为我需要从数组中获取键名,编码为
'north carolina'=>'nc'
,所以我使用
array\u flip()
来翻转键和值。因为输入的下拉列表的首字母大写,并且数组都是小写的,所以我使用
strtolower()
来获取所有小写的输入值

现在是有趣的部分。以下是直接从浏览器复制和粘贴的输出:

North Carolina
Observe: north carolina
Expect:  north carolina
Observed matches expected: false

如果其中有一些编码问题遗留下来的内容,但在浏览器中显示为UTF-8,那么输入值(观察值)和数组中比较的值(预期值)看起来都是相同的,这是有道理的。然而,它们在代码上并不匹配。发生了什么?

尝试
var\u dump()
检查字符串长度,可能包含一个前导空格。我正在运行PHP5.4,您可以使用func($array)['element\u key']它不应该是。我仅翻转它,以便您可以看到关联数组键的名称
array\u flip
返回键和值翻转的数组,因此键入值可以看到键,就像键入键可以看到未翻转数组中的值一样。你是对的。如果您可以将整个
$states
列表变为变量,以查看50个状态,每个状态都有一个键和值、一个开始行和一个结束行,可能会有所帮助。这是102行var_转储。这不太合适。但它们都是预期的长度和类型。