首页 > 解决方案 > CSV文件和特殊字符具有相同键和不同值的多个PHP数组

问题描述

我有许多共享相同键但值不同且顺序不同的数组:

$array = array(
          'English' => array(
                             '1' => 'Apples',
                             '2' => 'Oranges',
                             '3' => 'Bananas'
                            ),
           'Spanish' => array(
                             '3' => 'Plátanos',
                             '1' => 'Manzanas',
                             '2' => 'Naranjas'
                            ),
            'German' => array(
                             '1' => 'Äpfel',
                             '3' => 'Bananen',
                             '2' => 'Orangen'
                            ),
              );

我想从数组中创建一个 CSV 文件,期望每个数组值列在与图像中具有相同键的其他数组的值旁边的列中:

我试过这个:

 $header = array(
        'Key', 'English', 'Spanish', 'German'
    );

  $f_name = 'lang.csv';
  header("Content-type: text/csv");
  header("Content-Disposition: attachment; filename=$f_name");
  $output = fopen("php://output" , "w");
  fputcsv($output, $header);
  
  foreach($array as $row){
      fputcsv($output , array_values( $row ));
  }
  fclose($output);

但结果如下图所示:

标签: phpcsvutf-8

解决方案


您的代码尝试对仅包含 3 个值的 $row 的 fputcsv 并且您想要 4 个值作为键,而其他值...

首先要做的事情:对这些字符编码使用 UTF-8,您的文本应该没问题——这意味着您的 php 文件编码应该是 UTF-8。

正如 nitrin0 指出的那样,ksort($row); 是一件好事。但是您想向仅包含 3 个值的 $row 添加第四个值,即使使用 ++$c 也添加键,此处 array_values 也是多余的。

例子:

<?php

$array = array(
          'English' => array(
                             '1' => 'Apples',
                             '2' => 'Oranges',
                             '3' => 'Bananas'
                            ),
           'Spanish' => array(
                             '3' => 'Plátanos',
                             '1' => 'Manzanas',
                             '2' => 'Naranjas'
                            ),
            'German' => array(
                             '1' => 'Äpfel',
                             '3' => 'Bananen',
                             '2' => 'Orangen'
                            ),
              );

$header = array(
    'Key', 'English', 'Spanish', 'German'
);

$output = fopen("php://output" , "w");
fputcsv($output, $header);
$c = 1;
foreach($array as $row){
    $row[0] = $c;
    ksort($row);
    ++$c;
    fputcsv($output , $row);
}
fclose($output);

将输出:

Key,English,Spanish,German
1,Apples,Oranges,Bananas
2,Manzanas,Naranjas,Plátanos
3,Äpfel,Orangen,Bananen

该解决方案在很大程度上依赖于这样一个事实,即在您的 $array 数组中,您没有 0 个水果键......

因此,您可以在不依赖不存在的 0 键和没有 ksort 但使用合并的情况下工作:

$c = 1; 
foreach($array as $row){
    $arr[] = $c;
    $arr = array_merge($arr,$row);
    //print_r($arr);
    //ksort($row);
    ++$c;
    //print_r($row);
    fputcsv($output , $arr);
    $arr = [];
}
fclose($output);
echo '<pre>';
print_r($output);

将输出与其他代码示例相同的输出。


推荐阅读