Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在不同键上排序多维数组_Php_Arrays_Sorting - Fatal编程技术网

Php 在不同键上排序多维数组

Php 在不同键上排序多维数组,php,arrays,sorting,Php,Arrays,Sorting,我有很多文件夹,我使用directoryinterator将它们放入多维数组。结果是这样的 array:10 [▼ "SomeTitle" => array:2 [▼ 2018 => array:3 [▼ "February" => array:4 [▶] "January" => array:1 [▶] "March" => array:1 [▶] ] 2017 => array:11 [▼

我有很多文件夹,我使用
directoryinterator
将它们放入多维数组。结果是这样的

array:10 [▼
  "SomeTitle" => array:2 [▼
    2018 => array:3 [▼
      "February" => array:4 [▶]
      "January" => array:1 [▶]
      "March" => array:1 [▶]
    ]
    2017 => array:11 [▼
      "February" => array:9 [▶]
      "January" => array:12 [▶]
      "March" => array:9 [▶]
      "September" => array:9 [▶]
      "June" => array:8 [▶]
      "December" => array:12 [▶]
      "October" => array:8 [▶]
      "July" => array:10 [▶]
      "April" => array:8 [▶]
      "August" => array:10 [▶]
      "May" => array:10 [▶]
    ]
  ]
]
所以我有主键,然后是年,然后是月,然后是一些其他数据

我想做的是按年份和月份组织数据。所以2018年应该永远是第一位。然后我需要按月份顺序组织月份。目前,我正在将数组传递给这个函数

function sortArray($arr) {
    ksort($arr);

    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $arr[$k] = $this->sortArray($v);
        }
    }
    return $arr;
}
我不认为我需要K运动,因为这似乎把2017年放在第一位。当我运行上面的程序时,我得到以下结果

array:10 [▼
  "SomeTitle" => array:2 [▼
    2017 => array:11 [▼
      "April" => array:8 [▶]
      "August" => array:10 [▶]
      "December" => array:12 [▶]
      "February" => array:9 [▶]
      "January" => array:12 [▶]
      "July" => array:10 [▶]
      "June" => array:8 [▶]
      "March" => array:9 [▶]
      "May" => array:10 [▶]
      "October" => array:8 [▶]
      "September" => array:9 [▶]
    ]
    2018 => array:3 [▼
      "February" => array:4 [▶]
      "January" => array:1 [▶]
      "March" => array:1 [▶]
    ]
  ]
]
所以所有的东西基本上都是按字母顺序排列的。有没有办法改变这一点,让一年从最新开始到最旧,月份按日历顺序排列


感谢

与月份对应的数字键更有意义,但要使用名称:

function sortArray($arr) {
    krsort($arr);

    foreach ($arr as $k => &$v) {
        if (is_array($v)) {
            array_multisort(array_map(function($m) {
                                          return date('m', strtotime($m));
                                      }, array_keys($v)), $v);
        }
    }
    return $arr;
}
您希望
krsort
反向排序,然后映射数组月份以获取月份号,并对原始月份进行排序。注意
和$v

你可以用这个代替日期:

return strtotime($m);

与月份对应的数字键更有意义,但要使用名称:

function sortArray($arr) {
    krsort($arr);

    foreach ($arr as $k => &$v) {
        if (is_array($v)) {
            array_multisort(array_map(function($m) {
                                          return date('m', strtotime($m));
                                      }, array_keys($v)), $v);
        }
    }
    return $arr;
}
您希望
krsort
反向排序,然后映射数组月份以获取月份号,并对原始月份进行排序。注意
和$v

你可以用这个代替日期:

return strtotime($m);
您可以使用手动检查:

  • 如果键是数值:自然排序
  • 如果关键字与sort with不匹配(最好检查关键字是否等于“预定义”的月份名称,而不是检查
    strotime()==false
  • 使用
    strotime()进行else排序
代码:

产出:

Array (
  [SomeTitle] => Array (
    [2017] => Array (
      [January] => Array()
      [February] => Array()
      [March] => Array()
      [April] => Array()
      [May] => Array()
      [June] => Array()
      [July] => Array()
      [August] => Array()
      [September] => Array()
      [October] => Array()
      [December] => Array()
    )
    [2018] => Array (
      [January] => Array()
      [February] => Array()
      [March] => Array()
    )
  )
)
这是一个工作表。

您可以使用手动检查:

  • 如果键是数值:自然排序
  • 如果关键字与sort with不匹配(最好检查关键字是否等于“预定义”的月份名称,而不是检查
    strotime()==false
  • 使用
    strotime()进行else排序
代码:

产出:

Array (
  [SomeTitle] => Array (
    [2017] => Array (
      [January] => Array()
      [February] => Array()
      [March] => Array()
      [April] => Array()
      [May] => Array()
      [June] => Array()
      [July] => Array()
      [August] => Array()
      [September] => Array()
      [October] => Array()
      [December] => Array()
    )
    [2018] => Array (
      [January] => Array()
      [February] => Array()
      [March] => Array()
    )
  )
)

这是一个可行的解决方案。

更智能的解决方案将添加数字键而不是月份,然后简单地按数字重新排序,如果需要,将数字替换为月份名称。更智能的解决方案将添加数字键而不是月份,然后简单地按数字重新排序,如果需要,将数字替换为月份名称。
date('m',$m)
包含月份名称的
$m
将发出
E_警告
并返回
false
。您可能想要一个
strotime()
。@salathe:谢谢编辑。我在没有测试的情况下发布,因此可能会出现其他问题:-(
date('m',$m)
带有
$m
的月名将发出
E\u警告,并返回
false
。您可能希望其中包含
strotime()
。@salath:谢谢编辑。我在没有测试的情况下发布,因此可能会出现其他问题:-(