PHP - trim() 问题

PHP - issue with trim()

上下文:

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

进程:

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

结果:

here are the firsts 2 keys, the 2nd one keeps its spaces.

初始过程(键=>值):

[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>');
$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 每个单独的值 您有 exploded 行之后,而不是之前:

    $keys = array_map('trim', $keys);
    
  2. 您应该使用 CSV 解析函数来解析 CSV,而不是重新发明轮子:

    $keys = str_getcsv($file[0], ';');
    
  3. 您应该使用 fgetcsv 解析整个 CSV 文件以提高效率:

    function read_and_convert_line($fh) {
        $values = fgetcsv($fh, 0, ';');
        if (!$values) {
            return false;
        }
    
        return array_map(
            function ($value) { return mb_convert_encoding($value, 'UTF-8', 'Windows-1252'); }, 
            $values
        );
    }
    
    $fh = fopen(__DIR__ . '/path/to/' . $csv_file);
    $headers = read_and_convert_line($fh);
    $data = [];
    
    while ($row = read_and_convert_line($fh)) {
        $data[] = array_combine($headers, $row);
    }
    
    fclose($fh);
    print_r($data);
    

    这应该完全不需要 trim