PHP关联数组奇怪行为

时间:2018-01-19 18:24:53

标签: php arrays associative-array array-key

我正在使用一个我初始化的关联数组:

$img_captions = array();

然后,在代码中稍后我在一个while循环中填充它,其中键和值来自.txt文件(该.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错误说:

  

注意:未定义的索引:f1.jpg in ...

我对这里发生的事情毫无头绪 - 有人可以告诉我吗?

BTW我正在使用带有PHP 5.3的USBWebserver。

UPDATE 1:所以通过更好地探索'print_r(array_keys($ img_captions));'的输出在Chrome内部(F12键)我发现了一些奇怪的东西 - 第一行'[0] => f1.jpg'看起来非常虚弱当它在网站上显示为print_r()输出时看起来很正常,我注意到它实际上在网页源(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号线以外的任何东西时,它的工作正常。我试图完全删除文件并再次重写,但仍然会发生同样的情况......

  

免责声明伙计们,只是为了更恰当地澄清事情:这不是我的原始代码(完全由我完成),它是   实际上是我刚刚制作的 MiniGal Nano PHP照片   需要但我们正在讨论的那些特定部分是 FROM THE   原始作者

2 个答案:

答案 0 :(得分:2)

我建议您沿着file()使用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);

答案 1 :(得分:0)

所以过了一段时间我发现我的.txt文件本身有问题: -

总是在第一行的前面放置一些奇怪的标志,无论我做什么,它总是随着SCRATCH创建的新文件(尽管那些不可见,除非在网页上看作是源代码!!!)

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

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

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

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

  

(那些奇怪的迹象:[0] => f1.jpg)这是一个BYTE ORDER MARK或BOM的HTML实体,保存你的文件   在您正在使用的任何编辑器中都没有BOM。