Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 按3个值对多维数组排序,或按值将数组拆分为3个数组_Php_Arrays_Sorting - Fatal编程技术网

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);但它没有给我任何东西,实际上阻止了页面一直加载。看起来我没有定义数组\列(不存在)。