【问题标题】:PHP Associative array strange behaviorPHP关联数组奇怪的行为
【发布时间】:2018-06-29 01:33:20
【问题描述】:

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

$img_captions = array();

然后,稍后在代码中,我将使用来自 .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...

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

顺便说一句,我正在使用带有 PHP 5.3 的 USBWebserver。

更新 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 照片集以适合我的 需要,但我们正在谈论的那些特定部分是来自 原作者

【问题讨论】:

  • print_r(array_keys($img_captions)); 的输出是什么?
  • 您的代码有几个问题:Don't use while (!feof($file_handle))'/n' 应该是 "\n"(错误的引号,错误的斜线)。
  • 首先没有必要在换行符上爆炸,因为fgets() 只读取一行。
  • 我敢打赌,实际的问题是文件中的文件名字段之前或之后有空格。
  • 这是 BYTE ORDER MARK 或 BOM 的 HTML 实体,在您使用的任何编辑器中保存没有 BOM 的文件。或者它以其他方式到达那里。

标签: php arrays associative-array array-key


【解决方案1】:

我会推荐你​​使用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);

【讨论】:

  • trim() 可能是他缺少的解决方案。
  • @Barmar 我认为完全一样,但我有一个比 OP 的代码更好的主意。所以我将这个想法与trim() 一起发布
【解决方案2】:

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

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

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

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

但我的解决方案是更改保存字符串对 (.txt => .log) 的文件类型,这为我解决了这个“问题”。

正如@AbraCadaver 所说,一些其他可能的解决方案

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2016-02-16
    • 2012-02-18
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多