rosavox/lib/alveolata/csv/functions.php
2025-05-23 07:33:29 +00:00

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;
}
}
);
}
);
}
?>