生成php名称数组

生成php名称数组,php,mysql,sorting,names,Php,Mysql,Sorting,Names,我正在尝试创建一个包含数据库中所有成员的成员列表,但是他们是以名字为基础的。所以我想在打印之前先把姓氏放在第一位 为此,我编写了以下函数: function surname($name){ $exploded = explode(" ", $name); $num = count($exploded); $move = $exploded[$num - 1]; unset($exploded[$num - 1]); array_unshift($expl

我正在尝试创建一个包含数据库中所有成员的成员列表,但是他们是以名字为基础的。所以我想在打印之前先把姓氏放在第一位

为此,我编写了以下函数:

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是按前面的名字而不是姓氏排序的,所以我想在后面对数组进行排序)

然而,这并没有带来任何回报,我认为这是因为数组在每个循环中都会被重新生成

所以我的问题是,这是一种有效的方法,还是我必须做一些完全不同的事情


请帮忙

像这样的东西可能有用,但请注意,它还没有经过测试

按子字符串从成员顺序中选择*索引(名称,,-2)

它应该选择出现在第一个空格右侧的前两个单词。这应该考虑中间名和姓氏

好吧,这也行,它很凌乱/计算量很大,但可以用。循环中的循环很可怕,但是没有将db固定到一个合适的结构,这是你能得到的最好的结果(除非你想进入regex的黑魔法)

$surnamesarray = array();
 $sql = "SELECT * FROM Members";
                $self = mysql_query($sql);
                while ($row = mysql_fetch_array($self)) {
                    $temparray = explode(" ",$row['name']);
                    $substring = "";
                    for ($i=0;$i<count($temparray);$i++) {
                     $substring .= " ".$temparray[$i];
                    }
                    $surnamesarray[] = trim($substring)
                }

// now we just array sort so 
sort($surnamesarray);
var_dump($surnamesarray);//you would now for each this array again to display i'm just dumping out here
$namesarray=array();
$sql=“从成员中选择*”;
$self=mysql\u查询($sql);
while($row=mysql\u fetch\u数组($self)){
$temparray=explode(“,$row['name']);
$substring=“”;

对于循环中的($i=0;$i),将第二个
$name
更改为
$names[]
,然后不要回显,而是
打印($names)
,并尝试使用regex删除数组push

,您可以使
姓氏
函数成为简单的一行:
返回preg\u replace(“/(\w+\s+)(\w+)/”,“$2,$1',$name);
但这只在只有两个词的情况下有效,对吗?我的名字可以有两个或更多。(我认为4是当前的最大值,但我想对那些名字疯狂的人保持开放)名字实际上是不可能验证的,你对“Miguel Perez de Francisco”有什么期待例如?我上面的代码是有缺陷的,但其他解决方案也是有缺陷的,因为名字是不可预测的。理想情况下,您应该有两个不同的字段,一个是“姓名”,一个是“姓氏”然后将它们分别存储在数据库中,但这样做似乎为时已晚……那将是
Francisco,Miguel Perez de
,是的,我用这些名字有点太晚了:PSee,这个名字我希望是
Perez de Franscisco,Miguel
,但是的,我想太晚了。如果这不是小事,我会花时间“修复”DB。但是如果他们没有中间名怎么办?有些人有两个,比如“Van Der”,它仍然有效。如果你需要允许3个名字,它将在空格后匹配多达2个条目(我认为Van Der总是用连字符表示,这证明了我知道多少)如果你想真正安全的话,就把它改成-3或-4或-5。它似乎只会得到与之完全匹配的那些。所以那些3长的工作时间所有其他人都不确定,那么你就必须在查询中或查询外对其进行正则化
$surnamesarray = array();
 $sql = "SELECT * FROM Members";
                $self = mysql_query($sql);
                while ($row = mysql_fetch_array($self)) {
                    $temparray = explode(" ",$row['name']);
                    $substring = "";
                    for ($i=0;$i<count($temparray);$i++) {
                     $substring .= " ".$temparray[$i];
                    }
                    $surnamesarray[] = trim($substring)
                }

// now we just array sort so 
sort($surnamesarray);
var_dump($surnamesarray);//you would now for each this array again to display i'm just dumping out here