web-dev-qa-db-ja.com

PHP配列をCSV文字列に変換します

Stackoverflowとgoogleの両方から、php配列をcsv文字列に変換するいくつかの方法があります。しかし、01727499452などの携帯電話番号を保存したい場合、最初の0の値なしで保存されるのではないかと困っています。私は現在、このコードを使用しています: 配列をcsvに変換

誰かが私を助けてください。

Array   

[1] => Array
    (
        [0] => Lalu ' " ; \\ Kumar
        [1] => Mondal
        [2] => 01934298345
        [3] => 
    )

[2] => Array
    (
        [0] => Pritom
        [1] => Kumar Mondal
        [2] => 01727499452
        [3] => Bit Mascot
    )

[3] => Array
    (
        [0] => Pritom
        [1] => Kumar Mondal
        [2] => 01711511149
        [3] => 
    )

[4] => Array
    (
        [0] => Raaz
        [1] => Mukherzee
        [2] => 01911224589
        [3] => Khulna University 06
    )

私のコードブロック:

function arrayToCsv( array $fields, $delimiter = ';', $Enclosure = '"', $encloseAll = false, $nullToMysqlNull = false ) {
$delimiter_esc = preg_quote($delimiter, '/');
$Enclosure_esc = preg_quote($Enclosure, '/');

$outputString = "";
foreach($fields as $tempFields) {
    $output = array();
    foreach ( $tempFields as $field ) {
        if ($field === null && $nullToMysqlNull) {
            $output[] = 'NULL';
            continue;
        }

        // Enclose fields containing $delimiter, $Enclosure or whitespace
        if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${Enclosure_esc}|\s)/", $field ) ) {
            $field = $Enclosure . str_replace($Enclosure, $Enclosure . $Enclosure, $field) . $Enclosure;
        }
        $output[] = $field." ";
    }
    $outputString .= implode( $delimiter, $output )."\r\n";
}
return $outputString; }

おかげで、

プリトム。

16
Pritom

str_putcsv 関数:

if(!function_exists('str_putcsv'))
{
    function str_putcsv($input, $delimiter = ',', $Enclosure = '"')
    {
        // Open a memory "file" for read/write...
        $fp = fopen('php://temp', 'r+');
        // ... write the $input array to the "file" using fputcsv()...
        fputcsv($fp, $input, $delimiter, $Enclosure);
        // ... rewind the "file" so we can read what we just wrote...
        rewind($fp);
        // ... read the entire line into a variable...
        $data = fread($fp, 1048576);
        // ... close the "file"...
        fclose($fp);
        // ... and return the $data to the caller, with the trailing newline from fgets() removed.
        return rtrim($data, "\n");
    }
 }

 $csvString = '';
 foreach ($list as $fields) {
     $csvString .= str_putcsv($fields);
 }

この詳細については、@-johanmeiringによって作成された関数 GitHub を参照してください。

29
alexcristea

これが必要ですか?

$out = "";
foreach($array as $arr) {
    $out .= implode(",", $arr) . "\r\n";

}

これは、配列を介して実行され、各ループで配列値を「、」で区切って新しい行を作成します。

18
Daniel Mensing

数値が実際に先行ゼロなしで保存されていることを確認しますか?テキストエディタで実際のCSV出力を確認しましたか?

スプレッドシートアプリケーションでCSVファイルを開いたばかりの場合、おそらく、スプレッドシートが電話番号を数値として解釈し、それらを表示するときにゼロをドロップしています。通常、その特定の列の書式設定オプションを変更することで、スプレッドシートでそれを修正できます。

2

これは、もう少し一般的な目的のソリューションです。 SQL一括挿入用の文字列リストを作成する方法を実際に探していました。コードは次のようになります。

foreach ($rows as $row) {
    $string = toDelimitedString($row);
    // Now append it to a file, add line break, whatever the need may be
}

そして、これが私が私のtakekitに追加してしまった便利な機能です:

/**
 * Convert an array of strings to a delimited string. This function supports CSV as well as SQL output since
 * the quote character is customisable and the escaping behaviour is the same for CSV and SQL.
 *
 * Tests:
 *  echo toDelimitedString([], ',', '\'', true) . "\n";
 *  echo toDelimitedString(['A'], ',', '\'', true) . "\n";
 *  echo toDelimitedString(['A', 'B'], ',', '\'', true) . "\n";
 *  echo toDelimitedString(['A', 'B\'C'], ',', '\'', true) . "\n";
 *  echo toDelimitedString([], ',', '\'', true) . "\n";
 *  echo toDelimitedString(['A'], ',', '"', true) . "\n";
 *  echo toDelimitedString(['A', 'B'], ',', '"', true) . "\n";
 *  echo toDelimitedString(['A', 'B"C'], ',', '"', true) . "\n";
 *
 * Outputs:
 *  <Empty String>
 *  'A'
 *  'A','B'
 *  'A','B''C'
 *  <Empty String>
 *  "A"
 *  "A","B"
 *  "A","B""C"
 *
 * @param array $array A one-dimensional array of string literals
 * @param string $delimiter The character to separate string parts
 * @param string $quoteChar The optional quote character to surround strings with
 * @param bool $escape Flag to indicate whether instances of the quote character should be escaped
 * @return string
 */
function toDelimitedString(array $array, string $delimiter = ',', string $quoteChar = '"', bool $escape = true)
{
    // Escape the quote character, since it is somewhat expensive it can be suppressed
    if ($escape && !empty($quoteChar)) {
        $array = str_replace($quoteChar, $quoteChar . $quoteChar, $array);
    }

    // Put quotes and commas between all the values
    $values = implode($array, $quoteChar . $delimiter . $quoteChar);

    // Put first and last quote around the list, but only if it is not empty
    if (strlen($values) > 0) {
        $values = $quoteChar . $values . $quoteChar;
    }

    return $values;
}
0
Dion Truter

これはCSVであり、JSONのようなものではないため、とにかくすべてが文字列として読み取られるので、次のようにして数値を文字列に変換します。

  • _(string)$variable_
  • strval($variable)(私はここで優先します)
  • _$variable . ''_のような空の文字列と連結します

PHPのgettype()もオプションになります。私が説明した方法のいずれかを使用して、すべてのフィールドを文字列にキャストすることができます(すでに1である場合でも)、またはdoing this:

_if (gettype($field) == 'integer' || gettype($field) == 'double') {
    $field = strval($field); // Change $field to string if it's a numeric type
}
_

これが追加された完全なコードです

_function arrayToCsv( array $fields, $delimiter = ';', $Enclosure = '"', $encloseAll = false, $nullToMysqlNull = false ) {
    $delimiter_esc = preg_quote($delimiter, '/');
    $Enclosure_esc = preg_quote($Enclosure, '/');

    $outputString = "";
    foreach($fields as $tempFields) {
        $output = array();
        foreach ( $tempFields as $field ) {
            // ADDITIONS BEGIN HERE
            if (gettype($field) == 'integer' || gettype($field) == 'double') {
                $field = strval($field); // Change $field to string if it's a numeric type
            }
            // ADDITIONS END HERE
            if ($field === null && $nullToMysqlNull) {
                $output[] = 'NULL';
                continue;
            }

            // Enclose fields containing $delimiter, $Enclosure or whitespace
            if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${Enclosure_esc}|\s)/", $field ) ) {
                $field = $Enclosure . str_replace($Enclosure, $Enclosure . $Enclosure, $field) . $Enclosure;
            }
            $output[] = $field." ";
        }
        $outputString .= implode( $delimiter, $output )."\r\n";
    }
    return $outputString; 
}
_
0
wgp

上記の関数は正確ではありません。各行を\ nで区切るだけなので、要素と同様に\ nと見なされます。したがって、より効率的なコードは次のようになります。

function array2csv($array, $delimiter = "\n") {
    $csv = array();
    foreach ($array as $item=>$val) 
    {
        if (is_array($val)) 
        { 
            $csv[] = $this->array2csv($val, ";");
        } 
        else 
        {
            $csv[] = $val;
        }
    }
    return implode($delimiter, $csv);
}
0
Norbert

この関数を使用して、php配列をcsvに変換しています。多次元配列にも対応しています。

public function array_2_csv($array) {
$csv = array();
foreach ($array as $item=>$val) {
if (is_array($val)) { 
    $csv[] = $this->array_2_csv($val);
    $csv[] = "\n";
} else {
    $csv[] = $val;
  }
 }
return implode(';', $csv);
}
0
Julien