因此,我将名称存储在数据库中,但它们在一个字段中存储为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";
}
答案 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";
}