Skip to content

Commit f79913f

Browse files
author
苏青安
committed
增加Arr:csvToArray方法用于读取csv转换为数组,调整arrayToCsv可以输出到文件
1 parent 34a7c7b commit f79913f

File tree

1 file changed

+59
-14
lines changed

1 file changed

+59
-14
lines changed

src/Arr.php

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -116,39 +116,84 @@ public static function groupByField(array $array, string $field): array
116116
return $grouped;
117117
}
118118

119+
120+
/**
121+
* 读取 CSV 文件并返回数组格式
122+
*
123+
* @param string $filePath 文件路径
124+
* @param bool $withHeader 第一行是否作为键名返回(默认 false)
125+
*
126+
* @return array 返回的二维数组
127+
*/
128+
public static function csvToArray(string $filePath, bool $withHeader = false): array
129+
{
130+
if (!file_exists($filePath)) {
131+
throw new \Exception("文件不存在:$filePath");
132+
}
133+
134+
$handle = fopen($filePath, 'r');
135+
if (!$handle) {
136+
throw new \Exception("无法打开文件:$filePath");
137+
}
138+
$result = [];
139+
$headers = [];
140+
while (($row = fgetcsv($handle)) !== false) {
141+
if ($withHeader && empty($headers)) {
142+
$headers = $row;
143+
continue;
144+
}
145+
$result[] = $withHeader ? array_combine($headers, $row) : $row;
146+
}
147+
fclose($handle);
148+
return $result;
149+
}
150+
119151
/**
120152
* 数组转换为 CSV 格式的字符串
121153
*
122-
* @param array $array 数组
154+
* @param array $array 数组 [['A1','A2','A3'],['B1','B2','B3']]
155+
* @param string $filePath 输出文件路径,为空则返回字符串不输出到文件
123156
* @param string $delimiter CSV 分隔符,默认为逗号
124157
* @param string $enclosure CSV 包裹符号,默认为双引号
125158
* @param string $escapeChar 转义符号,默认为反斜杠
126159
*
127-
* @return string
160+
* @return string|bool
128161
*/
129-
public static function arrayToCsv(array $array, string $delimiter = ',', string $enclosure = '"', string $escapeChar = '\\'): string
162+
public static function arrayToCsv(array $array, string $filePath = '', string $delimiter = ',', string $enclosure = '"', string $escapeChar = '\\'): string|bool
130163
{
131-
// 开启输出缓冲区
132-
ob_start();
133-
// 打开 PHP 输出流
134-
$output = fopen('php://output', 'w');
135-
// 检查文件句柄是否打开成功
136-
if ($output === false) {
137-
throw new \Exception('无法打开输出流');
164+
// 如果传入了文件路径,则写入文件;否则使用输出缓冲区
165+
if ($filePath !== '') {
166+
// 创建目录(如果不存在)
167+
$dir = dirname($filePath);
168+
if (!is_dir($dir)) {
169+
if (!mkdir($dir, 0777, true) && !is_dir($dir)) {
170+
throw new \RuntimeException("无法创建目录: $dir");
171+
}
172+
}
173+
$output = fopen($filePath, 'w');
174+
if ($output === false) {
175+
throw new \Exception("无法写入文件: $filePath");
176+
}
177+
} else {
178+
ob_start();
179+
$output = fopen('php://output', 'w');
180+
if ($output === false) {
181+
throw new \Exception('无法打开输出流');
182+
}
138183
}
139-
// 遍历数组并写入 CSV 格式
184+
// 写入 CSV 数据
140185
foreach ($array as $row) {
141186
if (!is_array($row)) {
142187
throw new \Exception('输入的每一行都必须是一个数组');
143188
}
144189
fputcsv($output, $row, $delimiter, $enclosure, $escapeChar);
145190
}
146-
// 关闭文件句柄
147191
fclose($output);
148-
// 获取缓冲区内容
149-
return ob_get_clean();
192+
// 如果是写入文件,返回 true;否则返回 CSV 字符串
193+
return $filePath !== '' ? true : ob_get_clean();
150194
}
151195

196+
152197
/**
153198
* 解析 XML 数据并返回数组
154199
*

0 commit comments

Comments
 (0)