0

我正在尝试创建一个包含数据库中所有成员的成员列表,但是它们是以名称为基础的。因此,我尝试在打印之前将姓氏放在首位。

为此,我编写了这个函数:

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;

然而,这并没有回馈任何东西,我认为这是因为每个循环都会重新制作数组。

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

请帮忙。

4

2 回答 2

0

像这样的东西可能会起作用,但请注意它未经测试

SELECT * FROM Members ORDER BY SUBSTRING_INDEX(name, ' ', -2)

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

好的,这也适用于它的混乱/计算繁重但有效。循环中的循环很糟糕,但没有将您的数据库修复到适当的结构,这与您将获得的一样好(除非您想进入正则表达式的黑魔法。

$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
于 2013-07-07T22:17:49.707 回答
0

在你的循环中,将第二个更改$name$names[]then don't echo butprint_r($names)并尝试删除数组 push

于 2013-07-07T22:21:16.870 回答