根据订单php multidimentional数组安排月份名称

时间:2018-03-20 07:09:34

标签: php arrays

我有两个数组,第一个是月数组第二个是结果数组,

$ monthArray = array(“2018年1月,2018年2月”,“2018年3月”);

需要按月的顺序对以下数组进行排序

$result =
array(
        array(
            "day" => "Feb 2018",
            "value" => "101"
        ),
        array(
           "day" => "Jan 2018",
            "value" => "18"
        ),
        array(
           "day" => "Mar 2018",
            "value" => "0"
        )

我必须按月顺序对结果数组进行排序,如下面的输出

Array
(
[0] => Array
    (
        [day] => Jan 2018
        [value] => 18
    )
[1] => Array
    (
        [day] => Feb 2018
        [value] => 101
    )
[2] => Array
    (
        [day] => Mar 2018
        [value] => 0
    )
)

我正在尝试使用sort,usort,ksort php函数,但它无法正常工作。

2 个答案:

答案 0 :(得分:0)

试试这个,

$result =
    [
    [
        "day"   => "Feb 2018",
        "value" => "101",
    ],
    [
        "day"   => "Jan 2018",
        "value" => "18",
    ],
    [
        "day"   => "Mar 2018",
        "value" => "0",
    ],
];
usort($result, function($a, $b) {
  return new DateTime($a['day']) <=> new DateTime($b['day']);
});

usort - 使用用户定义的比较函数按值对数组进行排序

以下是demo

参考link

答案 1 :(得分:0)

如果您想按时间顺序排序,则不需要$monthArray变量。您可以使用strtotime()从月 - 年值生成时间戳,并对这些时间戳升序进行排序。您可以使用太空船操作员(<=>)比较排序调用中的值,或者如果您的php版本较旧,则可以使用减法。

代码:(Demo

$result =[
    ["day" => "Feb 2018", "value" => "101"],
    ["day" => "Jan 2018", "value" => "18"],
    ["day" => "Mar 2018", "value" => "0"]
];

usort($result,function($a,$b){return strtotime($a['day'])-strtotime($b['day']);});

var_export($result);

输出:

array (
  0 => 
  array (
    'day' => 'Jan 2018',
    'value' => '18',
  ),
  1 => 
  array (
    'day' => 'Feb 2018',
    'value' => '101',
  ),
  2 => 
  array (
    'day' => 'Mar 2018',
    'value' => '0',
  ),
)

如果您的分类月 - 年变量可以包含非按时间顺序排序,那么您可以使用array_replace()

  1. 翻转$monthArray以使值成为键。
  2. 使用array_column()第二个参数调用null,以便使用第3个参数指定的列数据为数组分配键。
  3. 根据关联键替换$monthArray值。
  4. 使用array_values()重新索引数组。
  5. 不同的代码,相同的结果:

    $monthArray = ["Jan 2018","Feb 2018","Mar 2018"];
    
    $result =[
        ["day" => "Feb 2018", "value" => "101"],
        ["day" => "Jan 2018", "value" => "18"],
        ["day" => "Mar 2018", "value" => "0"]
    ];
    
    $result = array_values(array_replace(array_flip($monthArray),array_column($result,null,'day')));
    var_export($result);
    

    根据输入数据的大小,每次迭代调用两次usort()时,这可能会比array_search()更快,也可能不会更快。无论哪种方式,最终用户都无法察觉速度差异。