我有一个数组结构,它的print_r
输出如下所示:
Array
(
[0] => Array
(
[0] => Game
[1] => Date
[2] => Site
[3] => Address
[4] => FirstName
[5] => LastName
[6] => Email
[7] => Phone
)
[1] => Array
(
[0] => B-Dry @ Blue Wave DH
[1] => 7/9/2019 13:00
[2] => Blue Wave Dover City Park
[3] => Dover
[4] => John
[5] => Doe
[6] => john.doe@perrylocal.org
[7] => (555) 555-4797
)
[2] => Array
(
[0] => B-Dry @ Blue Wave DH
[1] => 7/9/2019 13:00
[2] => Blue Wave Dover City Park
[3] => Dover
[4] => Frank
[5] => Sinatra
[6] => frank@sinatra.com
[7] => (555) 685-5555
)
[3] => Array
(
[0] => B-Dry @ Gnaden
[1] => 6/7/2019 18:00
[2] => Gnaden Indian Valley HS
[3] => Gnadenhutten
[4] => Jimmy
[5] => Dean
[6] => jimmy@dean.org
[7] => (330) 555-5555
)
[...many more...]
)
数据来自excel电子表格。如果它来自SQL,排序将是微不足道的。:-)
如何对此数组进行排序/重排序,如下所示:
This post似乎很有前途,但我相信array_column
只能在PHP5.5下工作,我还不能升级到PHP5.5。而且我不确定如何在所有情况下排除第一个数组集合(列标签)。
发布于 2018-08-14 01:44:18
下面是一个函数,它将根据需要的列数对多维数组进行排序:
function mult_usort(&$arr, $max_index = false, $index = 0) {
// Done on purpose, could not use a closure
function mult_usort_callback($a, $b, $max_index, $index) {
$max_index = $max_index ?: (count($a) - 1);
// Recursive to sort till the max index
if ($a[$index] == $b[$index]) {
if ($index < $max_index) {
return mult_usort_callback($a, $b, $max_index, ($index + 1));
} else {
return 0;
}
}
return $a[$index] > $b[$index] ? 1 : -1;
};
usort($arr, create_function('$a, $b', 'return mult_usort_callback($a, $b, ' . $max_index . ', ' . $index . ');'));
}
并像这样使用它:
// Remove the 1st item
array_shift($data);
// Change the date & time column to DateTime objects for proper comparison
// DateTime: PHP >= 5.2
$data = array_map(function ($item) {
$item[1] = DateTime::createFromFormat('d/m/Y H:i', $item[1]);
return $item;
}, $data);
// Then sort with the function, till index 2
mult_usort($data, 2);
此函数使用:
如果你的数据是一个SQL查询的结果,你最好在你的查询中使用ORDER
,这将会更容易并且更快的。
另请参阅:
发布于 2018-08-14 02:50:48
要删除第一个元素,只需:
unset($array[0]);
然后使用usort函数和DateTime比较:
<?php
$data = [
[
'Game',
'Date',
'Site',
'Address',
'FirstName',
'LastName',
'Email',
'Phone'
],
[
'B-Dry @ Gnaden',
'6/7/2019 18:00',
'Gnaden Indian Valley HS',
'Gnadenhutten',
'Jimmy',
'Dean',
'jimmy@dean.org',
'(330) 555-5555'
],
[
'B-Dry @ Blue Wave DH',
'7/9/2019 19:00',
'Blue Wave Dover City Park',
'Dover',
'John',
'Doe',
'john.doe@perrylocal.org',
'(555) 555-4797'
],
[
'B-Dry @ Blue Wave DH',
'7/9/2019 13:00',
'Blue Wave Dover City Park',
'Dover',
'Frank',
'Sinatra',
'frank@sinatra.com',
'(555) 685-5555'
]
];
unset($data[0]);
usort($data, function ($a, $b) {
if ($a[0] == $b[0]) {
$d1 = DateTime::createFromFormat('d/m/y h:i',$a[1]);
$d2 = DateTime::createFromFormat('d/m/y h:i',$b[1]);
if ($d1 == $d2) {
if ($a[2] == $b[2]) {
return 0;
}
return ($a[2] < $b[2]) ? -1 : 1;
}
return ($d1 < $d2) ? -1 : 1;
}
return ($a[0] < $b[0]) ? -1 : 1;
});
var_dump($data, true);
https://stackoverflow.com/questions/51827622
复制相似问题