PHP: Sort multi-array by deeper than level-1 dimension values with given field order
本问题已经有最佳答案,请猛点这里访问。
我的数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
我想根据孩子们的内在内容对他们进行分类。理想情况下,按开始年份、开始月份、结束年份、结束月份的顺序排列。我想我可以用一下
谢谢。
编辑:正如它所显示的,解决方案是好的和简单的,我不知道的是,在回调比较函数的比较过程中,您可以进入更深的结构-因此,如果您的比lvl-1更深的索引始终保持不变(我的情况),那就是如何做它:)
您可以使用PHP的usort函数并提供自己的比较函数。这样地:
1 2 3 4 5 6 7 8 9 10 11 | function cmp($a, $b) { if ($a[1]['start_year'] == $b[1]['start_year']) { // You can further do tests for start_month, etc in here if start_years are equal return 0; } return ($a[1]['start_year'] > $b[1]['start_year']) ? 1 : -1; } usort($MY_ARRAY,"cmp"); |
上面将按开始年份对数组进行排序。我还没有测试代码,但它应该可以工作。
为此,您可以使用uasort函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | function compare_callback($arr1, $arr2) { $start_year1 = $arr1[1]['start_year']; $start_year2 = $arr2[1]['start_year']; $start_month1 = $arr1[1]['start_month']; $start_month2 = $arr2[1]['start_month']; $end_year1 = $arr1[1]['end_year']; $end_year2 = $arr2[1]['end_year']; $end_month1 = $arr1[1]['end_month']; $end_month2 = $arr2[1]['end_month']; return ($start_year1 === $start_year2) ? (($start_month1 === $start_month2) ? (($end_year1 === $end_year2) ? (($end_month1 === $end_month2) ? 0 : (($end_month1 < $end_month2) ? -1 : 1)) : (($end_year1 < $end_year2) ? -1 : 1)) : ($start_month1 < $start_month2) ? -1 : 1) : (($start_year1 < $start_year2) ? -1 : 1); } uasort($array, 'compare_callback'); |
执行如下操作:
2