【问题标题】:make array of names php使名称数组php
【发布时间】: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,但是我想已经太晚了。如果这不是微不足道的,我会花时间“修复”数据库。

标签: php mysql sorting names


【解决方案1】:

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

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

【讨论】:

  • 但是如果他们没有中间名怎么办?有些人有 2 个,比如“范德”
  • 它仍然可以工作,如果你需要允许 3 个名字,它会在空格后匹配最多 2 个条目(我认为 van-der 总是被连字符证明我知道多少)将其更改为 - 3 或 -4 或 -5 如果你想真正安全的话。
  • 它似乎只得到与它完全匹配的那些。所以那些是 3 长时间工作的所有其他人都不会
  • 不确定那么您可能必须在查询中或查询外对其进行正则表达式
【解决方案2】:

在您的循环中,将第二个 $name 更改为 $names[] 然后不要回显但 print_r($names) 并尝试删除数组推送

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 2021-10-15
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2012-06-13
    相关资源
    最近更新 更多