【问题标题】:PHP print_r shows contents of associative array exploded from CSV file, but echo can't access individual values in itPHP print_r 显示从 CSV 文件分解的关联数组的内容,但 echo 无法访问其中的单个值
【发布时间】:2020-06-24 17:23:32
【问题描述】:

我有一个 CSV 文件来使一些 MySQL 变量易于阅读,其中行中的第一项是 MySQL 字段名称,第二项是要填写在字段中的用户友好名称,如下所示:

Hymn1,First Hymn,
Hymn2,Second Hymn,
date,Date,
C2W,Call To Worship,

然后我将创建单独的列表,以便教堂中的人们可以输入与他们相关的数据 - 音乐总监将输入名称、作者和歌词的国歌和奉献等。我将使用 MySQL 变量名填充该列表并从中生成页面。

我想将该 CSV 转换为一个数组,以便生成一个页面,该页面将以用户可读的方式为字段标签回显字段名称。

我认为我的部分问题是我的 CSV 文件放在一边。大多数答案都假设第一行是字段名称,其余是内容,但这里不是这种情况。

如果这是 Python,我会将它们压缩到字典中,但在 PHP 中显然您使用关联数组。


我打开 CSV 并将结果放入一个名为 $keys 的字符串中,并回显该字符串以验证它是否如上所示。

然后我声明了数组,去掉了换行符并用第二个逗号替换了它,然后用管道替换了第二个逗号:

$assoc = array();
$keys = str_replace("\r", ",", $keys);
$keys = str_replace(",,", "|", $keys);

之后,我将 $keys 字符串分解为一个以管道为分隔符的新变量。到目前为止,一切顺利。

$newvar = explode("|", $keys);

最后,我分解了数组中每个键中的每个逗号分隔项,并在 foreach 循环中将它们相互关联。

foreach($newvar as $iterator) {
    $mini = explode(",", $iterator);
    $mini[0] = ltrim($mini[0], "\n");
    $assoc[$mini[0]] = $mini[1]; }

当我在 $assoc 数组上执行 print_r 时,它给了我所希望的一切。从源代码来看:

Array
(
   [Hymn1] => First Hymn
   [Hymn2] => Second Hymn
   [date] => Date
   [C2W] => Call to Worship
)

但是 - 这就是问题所在 - 当我尝试使用 echo $assoc['Hymn1'];echo $assoc->Hymn1; 访问数组中的单个元素时,我什么也没得到。我可以回显“Hello World”,它会显示出来,但没有任何效果。

我也尝试过 str_getcsv,但它只创建了一个由每个逗号分隔的项目组成的数组,或者与这个类似的数组,当我尝试回显每个项目时最终什么都不打印。

我用谷歌搜索过,我在 StackOverflow 上阅读了几十个答案,包括页面建议的问题。我已经在这工作了好几个小时了,我已经准备好把我的头发拉出来了。我已经阅读了教程,我尝试创建一个简单的关联数组并对其进行回显以确保我做对了(我是),这一切都导致了一个答案:这应该有效,但它没有。有什么想法吗?

【问题讨论】:

    标签: php arrays csv associative-array


    【解决方案1】:

    您可以通过两种方式访问​​数据,使用字段名称或用户友好版本。

    此代码读取文件并在读取文件时创建两个数组。 $variables 使用 Hymn1 值作为键,$names 使用 First Hymn 值作为键。

    $variables = [];
    $names= [];
    $fh = fopen($fileName, "r");
    while ( $row = fgetcsv($fh))    {
        $variables [$row[0]] = $row[1];
        $names [$row[1]] = $row[0];
    }
    fclose($fh);
    
    print_r($variables);
    print_r($names);
    

    【讨论】:

    • 我这辈子都想不通为什么我能够访问这个数组中的各个元素,但不是我这样做的方式,但它确实有效!
    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2015-02-22
    • 2011-05-06
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多