101 lines
1.9 KiB
PHP
101 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace alveolata\csv;
|
|
|
|
require_once(DIR_ALVEOLATA . '/list/functions.php');
|
|
require_once(DIR_ALVEOLATA . '/string/functions.php');
|
|
|
|
|
|
/**
|
|
* @paraam array $data {list<list<string>>}
|
|
*/
|
|
function encode(
|
|
array $data,
|
|
?array $settings = null
|
|
) : string
|
|
{
|
|
$settings = array_merge(
|
|
[
|
|
'delimiter' => ";",
|
|
'linebreak' => "\n",
|
|
'quote' => "\"",
|
|
'prepend_byte_order_mark' => false,
|
|
],
|
|
($settings ?? [])
|
|
);
|
|
$csv = \alveolata\string\join(
|
|
\alveolata\list_\map(
|
|
$data,
|
|
function (array $row) use ($settings) : string {
|
|
return \alveolata\string\join(
|
|
\alveolata\list_\map(
|
|
$row,
|
|
function ($field) use ($settings) : string {
|
|
return sprintf(
|
|
'%s%s%s',
|
|
$settings['quote'],
|
|
str_replace($settings['quote'], '\\' . $settings['quote'], $field),
|
|
$settings['quote']
|
|
);
|
|
}
|
|
),
|
|
$settings['delimiter']
|
|
);
|
|
}
|
|
),
|
|
$settings['linebreak']
|
|
);
|
|
if ($settings['prepend_byte_order_mark']) {
|
|
$csv = (chr(0xEF) . chr(0xBB) . chr(0xBF) . $csv);
|
|
}
|
|
return $csv;
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function decode(
|
|
string $csv,
|
|
array $settings_given = []
|
|
) : array
|
|
{
|
|
$settings_default = [
|
|
'delimiter' => ";",
|
|
'linebreak' => "\n",
|
|
'quote' => "\"",
|
|
];
|
|
$settings = array_merge($settings_default, $settings_given);
|
|
return \alveolata\list_\map(
|
|
\alveolata\list_\filter(
|
|
\alveolata\string\split(
|
|
$csv,
|
|
$settings['linebreak']
|
|
),
|
|
function (string $line) : bool {
|
|
return (! empty(trim($line)));
|
|
}
|
|
),
|
|
function (string $line) use ($settings) : array {
|
|
return \alveolata\list_\map(
|
|
\alveolata\string\split(
|
|
$line,
|
|
$settings['delimiter']
|
|
),
|
|
function (string $field) use ($settings) {
|
|
if (
|
|
\alveolata\string\starts_with($field, $settings['quote'])
|
|
and
|
|
\alveolata\string\end_with($field, $settings['quote'])
|
|
) {
|
|
return substr($field, 1, strlen($field)-2);
|
|
}
|
|
else {
|
|
return $field;
|
|
}
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
|
|
?>
|