0

csv ファイルから、ヘッダーと値を抽出する必要があります。どちらも後でフロントエンドでアクセスされます。

$header = array();
$contacts = array();

if ($request->isMethod('POST')) {

   if (($handle = fopen($_FILES['file']['tmp_name'], "r")) !== FALSE) {
        $header = fgetcsv($handle, 1000, ",");

        while (($values = fgetcsv($handle, 1000, ",")) !== FALSE) {

            // array_combine
            // Creates an array by using one array for keys
            // and another for its values
            $contacts[] = array_combine($header, $values);
        }
        fclose($handle);
   }
} 

このようなcsvファイルで動作します

Name,Firstname,Organisation,
Bar,Foo,SO,

Gmail の連絡先をエクスポートし、上記のコードを使用して読み取ろうとしましたが、次のエラーが表示されます

警告: array_combine() [function.array-combine]: 両方のパラメーターの要素数は同じでなければなりません

Gmailのcsvは次のようになります

Name,Firstname,Organisation
Bar,Foo,SO

最後の欠落,はエラーの理由ですか? 何が問題で、どうすれば修正できますか?

SOでこれを見つけました

function array_combine2($arr1, $arr2) {
    $count = min(count($arr1), count($arr2));
    return array_combine(array_slice($arr1, 0, $count),
                         array_slice($arr2, 0, $count));
}

これは機能しますが、名前フィールドをスキップし、すべてのフィールドが結合されるわけではありません。これは、gmail の csv が実際には有効ではないためですか? 助言がありますか?

4

2 に答える 2

1

ヘッダーのサイズに応じて、配列サイズを拡張したり、スライスしたりして、これを管理しました。

if (count($header) > count($values)) {
    $contacts = array_pad($values, count($header), null);
} else if (count($header) < count($values)) {
    $contacts = array_slice($values, 0, count($header));
} else {
    $contacts = $values;
}
于 2013-02-20T09:03:59.313 に答える
1

これはあなたが尋ねた質問に対する答えではありませんが、問題の原因に対する答えかもしれません。fgetcsv()私は最近この問題を抱えており、関数のパラメーターを理解していなかったため、ばかげたエラーを起こしていることに気付きました。

そこ1000までは、コンテンツを取得しているcsvの1行の最大行長を示しています。それよりも長く、関数はnull!を返します。例に示されているバージョンがけちな理由はわかりませんが、必須ではありません。に設定すると、任意の長さの行を読み取ることが0できます。fgetcsv()(ドキュメンテーションでは、これは遅いと警告しています。ほとんどのユースケースではfgetcsv()、気付くほど遅いとはほとんど想像できません。)

于 2014-09-04T16:44:38.870 に答える