У меня есть несколько способов преобразования php-массива в строку csv как из stackoverflow, так и из google. Но у меня проблемы, если я хочу сохранить номер мобильного телефона, такой как 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; }
Благодаря,
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($fp, $fields); }
Подробнее об этом в GitHub , функции, созданной @johanmeiring.
Это то, что тебе надо?
$out = ""; foreach($array as $arr) { $out .= implode(",", $arr) . "\r\n"; }
Он проходит через ваш массив, создавая новую строку в каждом цикле, разделяя значения массива на «,».
Вы уверены, что цифры фактически сохраняются без начального нуля? Вы посмотрели фактический результат CSV в текстовом редакторе?
Если вы только что открыли файл CSV в приложении для работы с электронными таблицами, скорее всего это электронная таблица, которая интерпретирует ваши телефонные номера в виде числовых значений и отбрасывает нули при их отображении. Обычно вы можете исправить это в электронной таблице, изменив параметры форматирования в этом конкретном столбце.
Поскольку это CSV, а не что-то вроде JSON, все будет читаться как строка в любом случае, поэтому просто преобразуйте свой номер в строку с помощью:
(string)$variable
strval($variable)
(которую я бы предпочел здесь) $variable . ''
$variable . ''
PHP gettype()
также будет вариантом. Вы можете вводить каждое поле в строку (даже если она уже одна), используя один из описанных методов или вы можете вызывать только поле с номерами, которое вы выполните, выполнив следующее:
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; }
Я использую эту функцию для преобразования 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); }