php按姓氏排序下拉列表

时间:2016-03-10 22:59:07

标签: php arrays sorting

因此,我将名称存储在数据库中,但它们在一个字段中存储为firstname lastname。例如,字段名称names显示john doe

我希望我的name成为姓氏,名字最后一个(例如:doe, john),所以我想出了(下面的代码),但之后我需要对数组进行排序按姓氏,我该怎么做?

$names = array(
    1 => "Joe Johnson",
    2 => "Ann Marie blah",
    3 => "person three"
);  

foreach ($names as $id => $name) {

$parts = explode(" ", $name);

$lastname = array_pop($parts);

$firstname = implode(" ", $parts);  

$name = $lastname.", ".$firstname." ";  

echo    
    "<option value='$id'>$name</option>\n";
}

3 个答案:

答案 0 :(得分:1)

问题是您在同名foreach()循环中回显名称和姓氏的名称。

只需稍加修改,即可获得所需的结果。

首先,在foreach()循环(&之前$name)中使用引用。通过这种方式,您将直接更改数组值,而不是它们的副本。此$id中不需要foreach。从此循环中删除echo

foreach( $names as &$name )
{
    $parts     = explode(" ", $name);
    $lastname  = array_pop($parts);
    $firstname = implode(" ", $parts);  
    $name      = $lastname.", ".$firstname." ";  
}

foreach()循环结束时,我们必须unset() $name才能获得正确的结果(感谢先生请勿恐慌以获取建议):

unset( $name );

然后,使用natcasesort()对数组进行排序。使用natcasesort,您可以对不区分大小写进行排序并维护原始密钥,因此id中的<option>与原始数组相同:

natcasesort( $names );

最后,执行额外的foreach()循环来回显名称:

foreach( $names as $id => $name )
{
    echo "<option value='$id'>$name</option>\n";
}

修改

如果您愿意(我更喜欢),您可以使用foreach()array_walk()完全替换首个preg_replace()循环:

array_walk
(
    $names, 
    function( &$val ) 
    {
        $val = '['.preg_replace('/^(.+) +(\S+)$/','\2, \1',$val).']';
    }
);

为了清晰起见,我已经分解了语法,但这是一行代码。

答案 1 :(得分:0)

在只将姓氏输入数组后,您应该使用asort()来保留关键关联,这样您就可以根据这些键创建一个新的数组。

$names = array(
    1 => 'Joe Johnson',
    2 => 'Ann Marie blah',
    3 => 'person three'
);
function sortLastNames(&$fromArray){
  $s = $r = array();
  foreach($fromArray as $k => $v){
     $s[$k] = substr($v, (strrpos($v, ' ')+1));
  }
  asort($s, SORT_NATURAL | SORT_FLAG_CASE);
  foreach($s as $k => $v){
    $r[$k] = $fromArray[$k];
  }
  $fromArray = $r;
}
sortLastNames($names); $opts = '';
foreach($names as $k => $v){
  $opts .= "<option value='$k'>$v</option>\n";
}
$test = '<select>'.$opts.'</select>';
// now `echo $test;` where you want it

请注意,&$fromArray表示您在参数生效时传递的数组。此函数不会返回新数组。

答案 2 :(得分:0)

您可以执行您已经在做的事情,但使用引用以便使用新的姓氏优先格式更新数组,而不是在第一遍中回显该名称。

foreach ($names as $id => &$name) {  // use a reference here
    $parts = explode(" ", $name);
    $lastname = array_pop($parts);
    $firstname = implode(" ", $parts);
    $name = $lastname.", ".$firstname." ";
}

unset($name); // unset the reference

sort($names, SORT_NATURAL | SORT_FLAG_CASE); // sort the array

// then one more pass to echo the sorted names
foreach ($names as $id => $name) {
    echo "<option value='$id'>$name</option>\n";
}