PHP - trim()问题

时间:2018-04-27 12:05:46

标签: php arrays character-encoding trim spaces

上下文:

我保存了.csv个文件" " (第一行)到array $CSV以获取文件的多维数组 包含多个单词的键将其第一个和最后一个空格保留为第一个和最后一个字符。该文件以Windows-1252编码,我将其转换为UTF-8

过程:

$keys = mb_convert_encoding($keys, 'UTF-8', 'Windows-1252');
$keys = trim(str_replace('"', ' ', $keys));
$keys = explode(';', $keys);

结果:

  

这里是第一个2键,第二个键保留其空格。

初始流程(key => value):

[Commande] => C......
[ Date de création ] => 01/01/1970

使用 urlencode(substr($keys[$j], 0, 1)) 作为值:

[Commande] => C
[ Date de création ] => +

使用 rawurlencode(substr($keys[$j], 0, 1)) 作为值:

[Commande] => C
[ Date de création ] => %20

使用我在preg_replace('/\xc2\xa0/', '', $keys)等其他SO问题上找到的功能始终输出%20

我可以跳过此问题或以不同的方式工作,但我不明白为什么不能trim()这些字符串。

完整的示例代码:

$file = file(__DIR__ . '/path/to/' . $csv_file);
// Keys
$keys = mb_convert_encoding($file[0], 'UTF-8', 'Windows-1252');
$keys = trim(str_replace('"', ' ', $keys));
$keys = explode(';', $keys);

$CSV = [];

for ($i = 1; $i < count($file); $i += 1) {
    $values = explode(';', $file[$i]);
    for ($j = 0; $j < count($values); $j += 1) {
        $values[$j] = mb_convert_encoding($values[$j], 'UTF-8', 'Windows-1252');
        $values[$j] = trim(str_replace('"', ' ', $values[$j]));
        $values = array_combine($keys, $values);
        $CSV[] = $values;
    }
}
die('<pre>' . print_r($CSV, true) . '</pre>');

1 个答案:

答案 0 :(得分:2)

$keys = trim(str_replace('"', ' ', $keys));
$keys = explode(';', $keys);

大概你是从这一行开始的:

Commande;"Date de création";"Something something"

然后你将它变成这一行(你在这里引入空格):

Commande; Date de création ; Something something 

然后修剪(删除行开头和结尾处的空格):

Commande; Date de création ; Something something

然后你正在爆炸线:

array('Commande', ' Date de création ', ' Something something')
  1. trim
  2. 您应该使用CSV解析函数来解析CSV,而不是重新发明轮子:

    explode
  3. 您应该使用fgetcsv解析整个CSV文件,以提高效率:

    $keys = array_map('trim', $keys);
    

    这应该完全不需要$keys = str_getcsv($file[0], ';');