Php 按3个值对多维数组排序,或按值将数组拆分为3个数组
我有一个多维数组,如下所示:Php 按3个值对多维数组排序,或按值将数组拆分为3个数组,php,arrays,sorting,Php,Arrays,Sorting,我有一个多维数组,如下所示: maildate | mag | panel | status 2-22-16 | green | 1 | pending 2-22-16 | green | 3 | completed 2-22-16 | green | 2 | working 2-23-16 | red | 1 | pending 2-22-16 | blue | 1 | complete 我需要先按状态、日期、杂志和版本进行排序。我尝试过使用这个函数,它对状态很有效,但我无法让它在相同状态下
maildate | mag | panel | status
2-22-16 | green | 1 | pending
2-22-16 | green | 3 | completed
2-22-16 | green | 2 | working
2-23-16 | red | 1 | pending
2-22-16 | blue | 1 | complete
我需要先按状态、日期、杂志和版本进行排序。我尝试过使用这个函数,它对状态很有效,但我无法让它在相同状态下执行日期
// function to sort mulitdimensional array by key
function array_sort($array, $on, $order=SORT_ASC){
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
// sort lblist array by status
$lblist = array_sort($lblist, 'status', SORT_ASC);
我也有这个功能,看起来很有效,但是身份组被划分了
function sortByOrder($a, $b){
if ($b['status'] == $a['status']) {
if ($b['maildate'] == $a['maildate']) {
if ($b['mag'] == $a['mag']) {
return $b['panel'] - $a['panel'];
}
else {
return $b['mag'] - $a['mag'];
}
}
else {
return $b['maildate'] - $a['maildate'];
}
}
else {
return $b['status'] - $a['status'];
}
}
usort($lblist, 'sortByOrder');
我想,一旦数组按状态排序,就可以将数组除以状态,将它们放在一起,然后对每个“子”数组进行其他排序。回顾问题中的数组(尽管它是文本而不是实际代码),您可能希望对其进行规范化。在排序之前尝试以下操作:
foreach($lblist as $row) {
$array[] = array_combine($lblist[0], $row);
}
因此,您可以提取每个列并按顺序对其排序,然后根据该顺序对原始数组排序。请注意,maildate
需要转换为时间戳才能正确排序,mm dd YY
对于破折号-
无效。破折号使用dd-mm-YY
,因此您需要/
用于mm/dd/YY
。在需要时更改为SORT\u ASC
或SORT\u DESC
:
array_multisort(array_column($array, 'status'), SORT_ASC,
array_map('strtotime',
str_replace('-', '/',
array_column($array, 'maildate'))), SORT_ASC,
array_column($array, 'mag'), SORT_ASC,
array_column($array, 'panel'), SORT_ASC,
$array);
PHP>=5.5.0,用于array\u column()
或使用。或者检查并使用foreach()
方法创建排序中使用的数组
foreach($array as $row) {
$status[] = $row['status'];
$date[] = $row['maildate'];
$mag[] = $row['mag'];
$panel[] = $row['panel'];
}
然后用上面列出的数组替换排序中的array\u column()
调用
注意:很可能这是来自数据库,只要:
SELECT maildate, mag, panel, status FROM table_name ORDER BY status, maildate, mag, panel
使用数据库函数将maildate
转换为可排序格式,如YYYY-mm-dd
(示例:)考虑使用但首先捕获内部数组:
// RECREATE ARRAY
$mail = array();
$mail[0]['maildate'] = '2-22-16'; $mail[0]['mag'] = 'green'; $mail[0]['panel'] = 1; $mail[0]['status'] = 'pending';
$mail[1]['maildate'] = '2-22-16'; $mail[1]['mag'] = 'green'; $mail[1]['panel'] = 3; $mail[1]['status'] = 'completed';
$mail[2]['maildate'] = '2-22-16'; $mail[2]['mag'] = 'green'; $mail[2]['panel'] = 2; $mail[2]['status'] = 'working';
$mail[3]['maildate'] = '2-23-16'; $mail[3]['mag'] = 'red'; $mail[3]['panel'] = 1; $mail[3]['status'] = 'pending';
$mail[4]['maildate'] = '2-22-16'; $mail[4]['mag'] = 'blue'; $mail[4]['panel'] = 1; $mail[4]['status'] = 'completed';
$maildate = array();
$mag = array();
$panel = array();
$status = array();
// CAPTURE INNER ARRAYS
foreach ($mail as $rows) {
foreach ($rows as $key => $value) {
switch ($key) {
case 'maildate': $maildate[] = date_create_from_format('m-d-y', $value)->format('Y-m-d'); break;
case 'mag': $mag[] = $value; break;
case 'panel': $panel[] = $value; break;
case 'status': $status[] = $value; break;
}
}
}
// APPLY MULTIPLE SORTS TO MAIN ARRAY
array_multisort($status, SORT_ASC, $maildate, SORT_ASC,
$mag, SORT_ASC, $panel, SORT_ASC, $mail);
它来自数据库,但数组的所有元素不在数据库中的同一行中。状态随给定项目的每一行而变化。只有第一行有maildate、mag和panel。我必须进行第二次查询以获取最新状态。但这是另一个问题。谢谢,你可能会问一个关于数据库表结构的单独问题,你可能会得到一个很好的方法来查询已经排序的表。邮件日期是一个时间戳,所以我用了这个:
code
array\u multisort(array\u column($lblist,'status')、SORT\u ASC、array\u column($lblist,'maildate')、SORT\u ASC、array\u column($lblist,'mag')),排序ASC,数组列($lblist,'panel'),排序ASC,$lblist);但它没有给我任何东西,实际上阻止了页面一直加载。看起来我没有定义数组\列(不存在)。