如何使用PHP对以下CSV文件进行排序?我想按姓氏排序。我是否以某种方式使用正则表达式来获取姓氏中的第一个字母?任何帮助表示赞赏
以下是我的CSV文件的摘录 - 带有“;”名称和地址之间的分隔符
John C. Buckley, M.D.;123 Main Street, Bethesda MD 20816
Steven P. Wood;345 Elm Street, Rockville, MD 20808
Richard E. Barr-Fernandez;234 Pine Street, Takoma Park MD 20820
Charles Andrew Powell; 678 Oak Street, Gaithersburg MD 20800
Mark David Horowitz, III; 987 Wall Street, Silver Spring MD 20856
答案 0 :(得分:3)
这是我的尝试。我不确定正则表达式在提取姓氏方面有多么强大。
<?php
$handle = fopen('c:/csv.txt', 'r') or die('cannot read file');
$surnames = array();
$rows = array();
//build array of surnames, and array of rows
while (false != ( $row = fgetcsv($handle, 0, ';') )) {
//extract surname from the first column
//this should match the last word before the comma, if there is a comma
preg_match('~([^\s]+)(?:,.*)?$~', $row[0], $m);
$surnames[] = $m[1];
$rows[] = $row;
}
fclose($handle);
//sort array of rows by surname using our array of surnames
array_multisort($surnames, $rows);
print_r($rows);
//you could write $rows back to a file here if you wanted.
修改强>
我刚刚意识到你并不需要剥离人们的后缀,因为这可能不会真正影响排序。您可以将第一列拆分为空格并取最后一列(如karim79建议的那样)。如果这个人有更多带有空格的后缀,这可能会破坏,所以我会保留我的答案。
答案 1 :(得分:2)
好吧,因为它是一个CSV
$lines = file($file);
foreach($lines as $line)
{
$parts = explode(";", $line);
$last = explode(" ", $parts[0]);
$last = end($last);
$array[$last] = $parts;
}
ksort($array);
// ..... write it back to file
答案 2 :(得分:0)
PHP函数array_multisort应该做你想要的。您需要将CSV读入多维数组 - 请参阅链接页面上的第三个示例。