我可以在php中按字母顺序对子数组进行排序吗?

时间:2015-06-26 13:11:48

标签: php

我有$ mainArr数组,我希望结果为$ resultArr。

$mainArr = array(
            0 => array(125 => 'B', 127 => 'A', 178 => 'Z', 78 => 'G'),
            1 => array(111 => 'X', 127 => 'K', 108 => 'J', 708 => 'P'),
            2 => array(125 => 'L', 127 => 'M', 178 => 'Q', 78 => 'A'),
    );

我想要如下结果:

$resultArr = array(
        0 => array(127 => 'A', 125 => 'B', 78 => 'G', 178 => 'Z', ),
        1 => array(108 => 'J', 127 => 'K', 708 => 'P', 111 => 'X',),
        2 => array(78 => 'A', 125 => 'L', 127 => 'M', 178 => 'Q'),
    );

6 个答案:

答案 0 :(得分:1)

您可以使用array_map函数对多维数组进行排序。

要对上面的数组进行排序,您可以使用类似的内容

function sortArr($a) {
    natsort($a);
    return $a;
}

$mainArr = array(0 => array(125 => 'B', 127 => 'A', 178 => 'Z', 78 => 'G'),
            1 => array(111 => 'X', 127 => 'K', 108 => 'J', 708 => 'P'),
            2 => array(125 => 'L', 127 => 'M', 178 => 'Q', 78 => 'A'),
    );

$sortedArr = array_map( "sortArr", $mainArr);

它将给出以下输出

Array
(
    [0] => Array
        (
            [127] => A
            [125] => B
            [78] => G
            [178] => Z
        )

    [1] => Array
        (
            [108] => J
            [127] => K
            [708] => P
            [111] => X
        )

    [2] => Array
        (
            [78] => A
            [125] => L
            [127] => M
            [178] => Q
        )

)

答案 1 :(得分:1)

$mainArr = array_map( function( $a ){
    uksort( $a, function( $b, $c ) use( $a ){
        return $a[$b] > $a[$c];
    });
    return $a;
}, $mainArr );

答案 2 :(得分:0)

StackOverflow上的an answer似乎正是您正在寻找的东西:在PHP中对多维数组进行排序。它需要定义一个自定义比较函数并将它(以及您希望排序的数组)作为参数传递给uasort,它保持键值对之间的关​​联。注意:由于您要对每一行进行排序,您可能会对每一行进行排序,如下所示:

function cmp($a, $b) {
    return strcmp($a, $b); // also look into strnatcmp()

function sortArray($mainArr) {
    $resultArr = array();
    foreach (array $arr in $mainArr)
        $resultArr[] = uasort($arr, 'cmp'); // append the new row to $resultArr
    return $resultArr;
}

为了将来参考,在提出问题(如Burak提到的)之前,广泛使用google(一项值得学习的技能,特别是在此领域)非常有用。这样,人们就可以提供更有效的反馈和建议。

答案 3 :(得分:0)

您可以使用array_walk()遍历第一级并通过引用&来修改子数组,然后在保留原始键的同时调用每个子数组上的asort()以字母顺序进行排序。

不需要return,因为所有修改都直接应用于输入变量。

代码:(Demo

$mainArr = [
    [125 => 'B', 127 => 'A', 178 => 'Z', 78 => 'G'],
    [111 => 'X', 127 => 'K', 108 => 'J', 708 => 'P'],
    [125 => 'L', 127 => 'M', 178 => 'Q', 78 => 'A'],
];

array_walk($mainArr, function(&$subarray) {
    asort($subarray);
});

var_export($mainArr);

或者使用PHP7.4的箭头函数语法更简洁的等效技术(=>忽略了魔术array_walk()的返回值):(Demo

array_walk($mainArr, fn(&$subarray) => asort($subarray));

输出:

array (
  0 => 
  array (
    127 => 'A',
    125 => 'B',
    78 => 'G',
    178 => 'Z',
  ),
  1 => 
  array (
    108 => 'J',
    127 => 'K',
    708 => 'P',
    111 => 'X',
  ),
  2 => 
  array (
    78 => 'A',
    125 => 'L',
    127 => 'M',
    178 => 'Q',
  ),
)

答案 4 :(得分:-1)

你可以试试这个,它有点用力,但很容易理解

$resultArr = array();

foreach ( $mainArr as $sortme ) {
    asort($sortme);
    $resultArr[] = $sortme;

}

答案 5 :(得分:-1)

当然可以。

你可以这样做:

$resultArr = [];
foreach ($mainArr as $m){
    asort($m);
    $resultArr[] = $m;
}
var_dump($resultArr);

度过愉快的一天。