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


Can I Sort sub-array by its value alphabetically in 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'),
    );

您可以使用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
        )
)
$mainArr = array_map( function( $a ){
    uksort( $a, function( $b, $c ) use( $a ){
        return $a[$b] > $a[$c];
    });
    return $a;
}, $mainArr );

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

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

这里有一个关于StackOverflow的答案,它似乎正是您想要的:在PHP中对多维数组进行排序。它需要定义一个自定义比较函数,并将其(以及要排序的数组)作为参数传递给uasort,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所提到的)之前,广泛地搜索一下是有用的(这是一项值得学习的技能,尤其是在这个领域)。这样,人们可以提供更有效的反馈和建议。

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

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

代码:(演示)

$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',
  ),
)

当然可以。

你可以这样做:

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

祝你今天愉快。