【发布时间】:2013-07-07 22:09:26
【问题描述】:
我正在尝试创建一个包含数据库中所有成员的成员列表,但是它们是以名称为基础的。因此,我尝试在打印之前将姓氏放在首位。
为此我编写了这个函数:
function surname($name){
$exploded = explode(" ", $name);
$num = count($exploded);
$move = $exploded[$num - 1];
unset($exploded[$num - 1]);
array_unshift($exploded, $move);
$name = implode(", ", $exploded);
return $name;
}
在使用它的同时,我正在尝试制作一系列正确称呼的人。 (因为mysql是按名字排序的,而不是姓氏,所以我想把数组排序在后面)
$names = array();
$sql = "SELECT * FROM Members";
$self = mysql_query($sql);
while ($row = mysql_fetch_array($self)) {
$name = $row["name"];
$name = surname($name);
array_push($names, $name);
}
echo $names;
然而,这并没有返回任何东西,我认为这是因为每个循环都会重新制作数组。
所以我的问题是,这是一种有效的方法还是我必须做一些完全不同的事情?
请帮忙。
【问题讨论】:
-
使用正则表达式,您可以使
surname函数成为一个简单的单行:return preg_replace('/(\w+)\s+?(\w+)/','$2, $1',$name); -
但这只有在只有 2 个单词的情况下才有效,对吧?我的名字可以有 2 个或更多。 (我认为 4 是当前的最大值,但我想对名字很疯狂的人保持开放)
-
名称几乎无法验证,例如,您对“Miguel Perez de Francisco”有何期望?我上面的代码有缺陷,但其他所有解决方案也是如此,因为名称是不可预测的。理想情况下,您将有 2 个不同的字段,一个用于姓名,一个用于姓氏,并将它们分别存储在数据库中,但似乎为时已晚...
-
那个是
Francisco, Miguel Perez de,是的,我的名字有点太晚了:P -
看,那个名字我期待
Perez de Franscisco, Miguel,但是我想已经太晚了。如果这不是微不足道的,我会花时间“修复”数据库。