PHP 按几个标准对数组进行排序

问题描述 投票:0回答:2

我正在使用 PHP 进行编码并拥有一个多维数组。我想对我的数组进行排序。最重要的标准是总分。第二个标准是名字。

换句话说,数组应该这样排序:

第 1 位,按 [信息][总计] 排列,降序

第 2 位,按 [信息][名称] 升序排列

Array (
  [183] => Array (
    [3] => Array (
      [1] => Array ()
    )

    [1] => Array (
      [8] => Array ()
    )

    [info] => Array (
      [name] => Doe John /* 2nd criteria */
      [total] => 4800 /* 1st criteria */
    )
  )

  [380] => Array (
    [4] => Array (
      [6] => Array ()
    )

    [info] => Array (
      [name] => Davis Ben /* 2nd criteria */
      [total] => 14500 /* 1st criteria */
    )

    [2] => Array (
      [5] => Array ()
    )
  )
)

所以,结果应该是这样的:

Array (
  [380] => Array (
    [4] => Array (
      [6] => Array ()
    )

    [info] => Array (
      [name] => Davis Ben
      [total] => 14500
    )

    [2] => Array (
      [5] => Array ()
    )
  )

  [183] => Array (
    [3] => Array (
      [1] => Array ()
    )

    [1] => Array (
      [8] => Array ()
    )

    [info] => Array (
      [name] => Doe John
      [total] => 4800
    )
  )
)

我试过这个:

foreach ($array as &$item)
{
  uasort($item, function ($a, $b)
  {
    if ($a['total'] == $b['total']
    {
      return $b['name'] - $a['name'];
    }
    else
    {
      return $b['total'] - $a['total'];
    }
  }); 
}

我也尝试过这个,但没有帮助:

foreach ($array as &$item)
{
  uasort($item, function ($a, $b)
  {
    if ($a['info']['total'] == $b['info']['total'])
    {
      return $b['info']['name'] - $a['info']['name'];
    }
    else
    {
      return $b['info']['total'] - $a['info']['total'];
    }
  });
}
php arrays sorting multidimensional-array
2个回答
1
投票

您的问题的要求(按自定义标准对值进行排序,保持键和值之间的关联)完全符合PHP函数的描述

uasort()

代码是这样的:

$input = Array(
    '183' => Array(
        '3' => Array(
            '1' => Array(),
        ),
        '1' => Array(
            '8' => Array(),
        ),
        'info' => Array(
            'name'  => 'Doe John',      /* 2nd criteria */
            'total' => 4800,            /* 1st criteria */
        ),
    ),
    '380' => Array(
        '4' => Array(
            '6' => Array(),
        ),
        'info' => Array(
            'name'  => 'Davis Ben',     /* 2nd criteria */
            'total' => 14500,           /* 1st criteria */
        ),
        '2' => Array(
            '5' => Array(),
        ),
    ),
);

uasort($input, function (array $a, array $b) {
    // compare using the 1st criterion
    if ($a['info']['total'] != $b['info']['total']) {
        return $b['info']['total'] - $a['info']['total'];       // < 0 when $a > $b (descending)
    }

    // equality on the 1st criterion, use the 2nd one
    return strcmp($a['info']['name'], $b['info']['name']);      // < 0 when $a < $b (ascending)
});

0
投票

您可以通过构建两组数组进行比较来指定两种排序规则。对于 DESC 排序,将

$b
值写在比较运算符的左侧;对于 ASC 排序,请在比较运算符的左侧写入
$a

两个数组中的元素将以从左到右的方式进行比较。

代码:(演示

uasort(
    $array,
    fn($a, $b) => [$b['info']['total'], $a['info']['name']]  // total DESC, name ASC
                  <=>
                  [$a['info']['total'], $b['info']['name']]
);
var_export($array);
© www.soinside.com 2019 - 2024. All rights reserved.