PHP 关联数组的奇怪行为

PHP Associative array strange behavior

我正在使用这样初始化的关联数组:

$img_captions = array();

然后,在代码的后面,我用来自 .txt 文件的键和值填充它在一个 while 循环中(该 .txt 文件中的每一行都包含一对 - 一个字符串 - 用'|'分隔) 看起来像这样:

f1.jpg|This is a caption for this specific file
f2.jpg|Yea, also this one
f3.jpg|And this too for sure
...

我正在用这样的数据填充关联数组:

if (file_exists($currentdir ."/captions.txt"))
{
    $file_handle = fopen($currentdir ."/captions.txt", "rb");

    while (!feof($file_handle) )
    {
        $line_of_text = fgets($file_handle);
        $parts = explode('/n', $line_of_text);

        foreach($parts as $img_capts)
        {
            list($img_filename, $img_caption) = explode('|', $img_capts);
            $img_captions[$img_filename] = $img_caption;

        }
    }

    fclose($file_handle);
}

当我测试该关联数组时它是否确实包含如下键和值:

print_r(array_keys($img_captions));
print_r(array_values($img_captions));

...我看到它按预期包含它们,但是当我尝试通过直接调用实际使用它们时,例如:

echo $img_captions['f1.jpg'];

我收到 PHP 错误提示:

Notice: Undefined index: f1.jpg in...

我不知道这里发生了什么 - 谁能告诉我吗?

顺便说一句,我在 PHP 5.3.

中使用 USBWebserver

更新 1: 因此,通过更好地探索 Chrome(F12 键)中 'print_r(array_keys($img_captions));' 的输出,我发现了一些奇怪的东西 - '[0] => f1.jpg' 的第一行在视觉上看起来很奇怪 当它在网站上显示为 print_r() 输出时看起来很正常,我注意到它实际上在fact 在网页源代码中是这样编码的(F12):

Array
(
    [0] => f1.jpg
    [1] => f2.jpg
    [2] => f3.jpg
    [3] => f4.jpg
    [4] => f5.jpg
    [5] => f6.jpg
    [6] => f7.jpg
    [7] => f8.jpg
    [8] => f9.jpg
    [9] => f10.jpg
)

因此,当我测试 1. 行以外的任何其他内容时,它工作正常。我试图完全删除文件并重新写入一次,但仍然出现同样的情况...

DISCLAIMER Guys, just to clarify things more properly: THIS IS NOT MY ORIGINAL CODE (that is 'done completely by me'), it is actually a MiniGal Nano PHP photogalery I had just make to suit my needs but those specific parts we are talking about are FROM THE ORIGINAL AUTHOR

我会推荐你​​使用file() along wth trim()

您的代码变得简短、可读且易于理解。

$parts= file('your text file url', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$img_captions = [];
foreach($parts as $img_capts){
    list($img_filename, $img_caption) = explode('|', $img_capts);
    $img_captions[trim(preg_replace("/&#?[a-z0-9]+;/i","",$img_filename))] = trim(preg_replace("/&#?[a-z0-9]+;/i","",$img_caption));
}
print_r($img_captions);

所以过了一会儿我意识到我的 .txt 文件本身有问题:-

无论我做什么,总是在第一行前面放一些奇怪的标志,即使是从头开始创建的新文件(尽管这些是不可见的,除非在网页上被视为源代码) !!!)

所以我决定用另一种格式测试它,这次是 .log 文件,突然间一切正常。

我不知道这是否只是我的某种本地问题(很可能是)或其他我不知道的问题。

但我的解决方案是更改保存字符串对 (.txt => .log) 的文件类型,从而解决了这个问题'problem' 对我来说。

一些其他可能的解决方案 @AbraCadaver 说:

(Those strange signs: [0] => f1.jpg) That's the HTML entity for a BYTE ORDER MARK or BOM, save your file with no BOM in whatever editor you're using.