【问题标题】:PHP sort array keys starting at the 3rd character of the key [duplicate]PHP 从键的第 3 个字符开始对数组键进行排序 [重复]
【发布时间】:2023-02-09 06:50:36
【问题描述】:
array(4) {
    [D.Fletcher] = array(22) {
        [games] = int() 2
        [ab] = int() 6
        [runs] = int() 2
        [hits] = int() 2
    }
    [A.Slegers] = array(22) {
        [games] = int() 3
        [ab] = int() 0
        [runs] = int() 0
        [hits] = int() 0
    }
    [A.Eaton] = array(22) {
        [games] = int() 1
        [ab] = int() 2
        [runs] = int() 0
        [hits] = int() 0
    }
    [S.Ohtani] = array(22) {
        [games] = int() 3
        [ab] = int() 6
        [runs] = int() 2
        [hits] = int() 3
    }

我希望能够从键的第三个字符开始对数组进行排序。

如果我使用 ksort,我会得到:

A.Eaton
A.Slegers
D.Fletcher
S.Ohtani

但我想要:

A.Eaton
D.Fletcher
S.Ohtani
A.Slegers

我可以按如下方式执行此 SQL: SELECT * FROM batters order by SUBSTRING(name, 3)

但我不知道如何用 PHP 排序。 我知道我可以拿到钥匙

$keys=array_keys($arr);

或者在一个循环中:

foreach ($arr as $key => $value) {
   echo $key;
}

然后可能做一个 substr($key, 3) 但我无法弄清楚如何将它们放在一起进行排序。

【问题讨论】:

  • php.net/manual/en/function.uksort.php uksort,然后在你的回调函数中使用 substring 来切断前 2 个字母和 .,然后是它的 substr($a,2) <=> substr($b,2) 或排序函数中的类似内容。

标签: php arrays sorting


【解决方案1】:

正如我在 cmets 中所说

// Enter your code here, enjoy!
$array = [
    "D.Fletcher" => [],
    "A.Slegers" => [],
    "A.Eaton" => []
];


uksort($array, function($a,$b){
    return substr($a,2) <=> substr($b,2);
});

print_r($array);

输出

Array
(
   [A.Eaton] => Array()
   [D.Fletcher] => Array()
   [A.Slegers] => Array()
)

test

如果我是你,我个人会怎么做:

将选择带有您在 SQL 中 substr 的额外字段的数据

Select SUBSTRING(name, 2) as sort_name ....

然后,由于性能的原因,您现在可以将它们用作数据的键,而不是在数据库中排序。如果可能的话,最好不要在排序中使用 substr,因为这会被调用很多次。它非常快,所以没什么大不了的。但出于其他原因,我避免在数组键中使用 .。如果你删除它,你可能会有重复的名字,所以我很难说。

基本上我会构建数据,所以我不需要这样做,你仍然可以在 PHP 中排序。

也可以通过每个嵌套数组中的特定键将其排序为多维数组,例如,您可以将名称包含在子数组中,并创建一个搜索函数来对其进行排序。我只是尽量避免调用substr这么多。就性能而言,这可能没什么大不了的,这只是我的直觉。

【讨论】:

    【解决方案2】:

    uksort 示例有效。谢谢。

    供参考。我在不支持 PHP 7 代码提示的平台上工作,因此使用太空船运算符 <=> 时出现代码提示错误。使用 strcmp 也可以。

    return strcmp( substr($a,2), substr($b,2) );
    

    【讨论】:

      猜你喜欢
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多