【问题标题】:Is there a native multi-dimensional, multi-type sort in PHP?PHP中有原生的多维、多类型排序吗?
【发布时间】:2021-02-18 10:53:01
【问题描述】:

我正在努力在 PHP 中对多维、多类型数组进行排序。

通常我只使用sortrsortksort等。

这种情况似乎不需要任何更复杂的东西,但array_multisort 似乎不起作用(至少不是我使用它的方式)。

我的多维、多类型数组如下所示:

[
    'Welsh_Harmony' => [
        'Bread_Dip',
        'Cloud_Patterns',
        'Legendary_Sword',
        'Legumes_In_The_Garden',
        'Notice::Balloons',
        'Notice::Corvid',
        'Titanic',
        'novemberMonth',
        'Elephant_Graveyard'
    ],

    'Oak' => [
        'Keyboard'
    ]
]

array_multisort 给了我这个(只对了一半):

[
    'Oak' => [
        'Keyboard'
    ],

    'Welsh_Harmony' => [
        'Bread_Dip',
        'Cloud_Patterns',
        'Legendary_Sword',
        'Legumes_In_The_Garden',
        'Notice::Balloons',
        'Notice::Corvid',
        'Titanic',
        'novemberMonth',
        'Elephant_Graveyard'
    ]
]

而我试图产生的结果(注意'Elephant_Graveyard' 的位置)是:

[
    'Oak' => [
        'Keyboard'
    ],

    'Welsh_Harmony' => [
        'Bread_Dip',
        'Cloud_Patterns',
        'Elephant_Graveyard',
        'Legendary_Sword',
        'Legumes_In_The_Garden',
        'Notice::Balloons',
        'Notice::Corvid',
        'Titanic',
        'novemberMonth'
    ]
]

我尝试使用标志 SORT_STRINGSORT_ASC 提示 array_multisort 按字母顺序重新排序和重新索引二级数组,但这似乎也不起作用。

我很乐观,一定有一种方法可以在不编写自定义递归函数的情况下执行这种多维、多类型的排序。

【问题讨论】:

  • array_multisort 不会对数组的所有级别进行排序。您想要的是使用 foreach ($arr as &$a) sort($a); 之类的方式对数组中的每个数组进行排序
  • 试试看usort函数
  • 谢谢,@Zeusarm - 我确实看过usort,但它需要一个自定义回调,我担心性能。
  • @Rounin 相信我它很快 :-) 你只是在比较 2 个元素。 PHP 自己完成的所有迭代。
  • usort 对你没有任何帮助。您正在对数组 ['Oak' => ..., ...] 进行排序,不是其中的每个值。 usort 也不会对内部值进行排序。你需要明确地这样做。

标签: php sorting multidimensional-array mixed


【解决方案1】:

array_multisort() 可用于一次对多个数组进行排序,或者一个 一维或多维的多维数组。

这基本上就是您对数组的不同维度进行排序的方式:

$ar = array(
   array("10", 11, 100, 100, "a"),
   array(   1,  2, "2",   3,   1)
  );
array_multisort($ar[0], SORT_ASC, SORT_STRING,
            $ar[1], SORT_NUMERIC, SORT_DESC);

多重排序接受可变参数。阅读更多here,请向下滚动阅读cmets。


或者您可以循环遍历数组的数组并一一排序。

foreach ($matrix as &$row) { sort($row); } 

但是,我认为多排序会执行得更好。

【讨论】:

  • 啊哈。谢谢你,乌萨马。我现在更清楚地了解array_multisort。正如 deceze 在上面的 cmets 中指出的那样,我从根本上误解了该函数的用途。
猜你喜欢
  • 1970-01-01
  • 2015-10-20
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多