Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按保留键的姓氏对名称数组进行排序_Php_Arrays_Sorting - Fatal编程技术网

Php 如何按保留键的姓氏对名称数组进行排序

Php 如何按保留键的姓氏对名称数组进行排序,php,arrays,sorting,Php,Arrays,Sorting,我有一个数组,如下所示: Array( [27] => 'Sarah Green', [29] => 'Adam Brown', [68] => 'Fred Able' ); 我想按姓氏分类并保留钥匙: Array( [68] => 'Fred Able' [29] => 'Adam Brown', [27] => 'Sarah Green' ); 有些名字可能有两个以上的名字,但它总是我想排序的最后一个名字

我有一个数组,如下所示:

Array(
    [27] => 'Sarah Green',
    [29] => 'Adam Brown',
    [68] => 'Fred Able'
);
我想按姓氏分类并保留钥匙:

Array(
    [68] => 'Fred Able'
    [29] => 'Adam Brown',
    [27] => 'Sarah Green'
);
有些名字可能有两个以上的名字,但它总是我想排序的最后一个名字


在PHP中实现这一点的最佳方法是什么?

我不认为您可以直接使用PHP内置的数组排序来实现这一点,尽管如果有人纠正我的错误,我会很感兴趣

最简单的方法是反转名称,使其变为绿色,因为这样您就可以使用PHPs自己的排序函数,例如使用asort()(它维护密钥关联)

如果这不可行,您可能需要实现自己的自定义排序功能。最简单的方法是使用usort(),它允许您定义自定义比较器函数。例如:

usort($arr, "sortByLastName");

function sortByLastName($a, $b) {
     //DO YOUR COMPARISON IN HERE
}
您可以使用该函数,该函数允许您指定自定义排序方法,同时保留关键字:

<?php
// A function to sort by last name.
function lastNameSort($a, $b) {
    $aLast = end(explode(' ', $a));
    $bLast = end(explode(' ', $b));

    return strcasecmp($aLast, $bLast);
}

// The array of data.
$array = array(
    27 => 'Sarah Green',
    29 => 'Adam Brown',
    68 => 'Fred Able'
);

// Perform the sort:
uasort($array, 'lastNameSort');

// Print the result:
print_r($array);
?>


可能与此类似(未测试)

函数sortSurname($a,$b){
$sur_a=数组_pop(爆炸(“”,$a));
$sur_b=数组_pop(explode(“”,$b));
返回$sur_a<$sur_b;
}
usort($array,'sortSurname')
也许不是最快的方法,但它很有效。如果他们也有中间名的话,这是可行的

这比公认的答案快


我不确定是否有一种直接的方法可以按姓氏对示例数组进行排序

您可以以不同的方式向数组中添加名称。i、 e.“弗雷德·艾布尔”将变成“艾布尔,弗雷德”。这将允许您使用PHP内置的数组排序函数


如果做不到这一点,您可能必须遍历每个数组元素,并使用返回数组的最后一部分作为您的姓氏,按空格进行分解。有点混乱,但我肯定有很多示例和函数。

您可能需要创建一个带有姓氏的辅助数组,保留键,对其排序,然后重建原始数组:

function order_by_surname($names) {
    foreach ($names as $key => $name) {
        $surnames[$key] = array_pop(explode(' ', $name));
    }
    asort($surnames);
    foreach ($surnames as $key => $surname) {
        $ordered[$key] = $names[$key];
    }
    return $ordered;
}

另外,请注意,您可能在这方面有问题,因为当您有两个姓氏(例如约翰·克拉克·摩尔)时,姓氏并不总是全名的最后一个字。



。但是,与实际结果无关,
end
将其参数作为参考。这将导致“严格标准”错误。要修复此问题,只需首先将
explode('''$a)
explode(''$b)
分配给变量即可。对不起,只是吹毛求疵。@bob驱逐舰:啊,好的。谢谢你指出这一点!吹毛求疵是好的:)是一种享受,谢谢,而且比我没有得到任何进展的想法要优雅得多!还要感谢@bob the destroyer为您提供的提示。@bob the destroyer:是的,这只是一个示例函数。@minitech:要点。我将把剩下的留给OP。虽然这段代码可能会解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的up投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
function sortByLastName($a){
    $tmp = $a;
    foreach($tmp as $k => $v){
        $tmp[$k] = substr($v,strrpos($v, ' ')+1);
    }
    asort($tmp);
    $ret = array();
    foreach($tmp as $k => $v){
        $ret[$k] = $a[$k];
    }
    return $ret;
}
function order_by_surname($names) {
    foreach ($names as $key => $name) {
        $surnames[$key] = array_pop(explode(' ', $name));
    }
    asort($surnames);
    foreach ($surnames as $key => $surname) {
        $ordered[$key] = $names[$key];
    }
    return $ordered;
<?php
$names= Array('Fred Able','Adam Brown','Sarah Green');

$new_arr=array();

$clength = count($names);
for($x = 0; $x < $clength; $x++) {

  $y= array_reverse(explode(' ',$names[$x]));
  
  $y=implode(" ",$y);
  
  array_push($new_arr,$y);
  
}

rsort($new_arr); // for rsort sorting with descending order,  for ASC use sort

print_r($new_arr);

?>