-3

我有 $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'),
    );
4

6 回答 6

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
        )

)
于 2015-06-26T13:24:13.627 回答
1
$mainArr = array_map( function( $a ){
    uksort( $a, function( $b, $c ) use( $a ){
        return $a[$b] > $a[$c];
    });
    return $a;
}, $mainArr );
于 2015-06-26T13:27:01.600 回答
0

这是 StackOverflow 上的一个答案,似乎正是您正在寻找的:在 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 所提到的)之前,广泛使用谷歌(一项值得学习的技能,尤其是在该领域)很有用。这样,人们可以提供更有效的反馈和建议。

于 2015-06-26T13:24:23.573 回答
0

你可以试试这个,它有点曼陀罗,但很容易理解

$resultArr = array();

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

}
于 2015-06-26T13:25:13.770 回答
0

您可以使用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()):(演示

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',
  ),
)
于 2020-01-27T03:45:56.293 回答
-1

当然可以。

你可以这样做:

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

祝你今天过得愉快。

于 2015-06-26T13:39:18.230 回答