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