Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Cakephp - Fatal编程技术网

Php 高效排序多维数组

Php 高效排序多维数组,php,arrays,cakephp,Php,Arrays,Cakephp,以下是我的数组的内容: array( 'June 01, 2014' => array( (int) 722107 => array( 'date' => 'June 01, 2014', 'start_time' => '2:00 AM', 'end_time' => '03:00 AM' ), (int) 117646 => array( 'date' =>

以下是我的数组的内容:

array(
  'June 01, 2014' => array(
    (int) 722107 => array(
        'date' => 'June 01, 2014',
        'start_time' => '2:00 AM',
        'end_time' => '03:00 AM'
    ),
    (int) 117646 => array(
        'date' => 'June 01, 2014',
        'start_time' => '12:30 AM',
        'end_time' => '03:30 AM'
    )
  ),
  'May 31, 2014' => array(
    (int) 769349 => array(
        'date' => 'May 31, 2014',
        'start_time' => '12:30 AM',
        'end_time' => '03:30 AM'
    )
  )
)
我想要的输出是,它应该首先按键排序(ASC中的日期),然后再按ASC中的开始时间对每个键的值进行排序

根据上述示例,它应输出:

array(
     'May 31, 2014' => array(
    (int) 769349 => array(
        'date' => 'May 31, 2014',
        'start_time' => '12:30 AM',
        'end_time' => '03:30 AM'
    )
 ),
'June 01, 2014' => array(

    (int) 117646 => array(
        'date' => 'June 01, 2014',
        'start_time' => '12:30 AM',
        'end_time' => '03:30 AM'
    ),
    (int) 722107 => array(
        'date' => 'June 01, 2014',
        'start_time' => '2:00 AM',
        'end_time' => '03:00 AM'
    )
   )

    )

这两个过程可以与
uksort()
uasort()
一起使用自定义函数比较两个日期:

function timeCompare($a, $b)
{
    $va = strtotime($a);
    $vb = strtotime($b);

    if ($va != $vb) {
        return $va < $vb ? -1 : 1;
    }
    return 0;
}

// first pass (sort outer elements)
uksort($data, 'timeCompare');
// second pass (sort inner elements)
foreach ($data as &$item) {
    uasort($item, function($a, $b) {
        return timeCompare($a['start_time'], $b['start_time']);
    });
}
函数时间比较($a,$b)
{
$va=标准时间($a);
$vb=标准时间($b);
如果($va!=$vb){
返回$va<$vb?-1:1;
}
返回0;
}
//第一遍(对外部元素进行排序)
uksort($data,'timeCompare');
//第二遍(对内部元素进行排序)
foreach($data as&$item){
uasort($item,function($a,$b){
返回时间比较($a['start\u time'],$b['start\u time']);
});
}

这两个过程可以通过使用自定义函数比较两个日期的
uksort()
uasort()

function timeCompare($a, $b)
{
    $va = strtotime($a);
    $vb = strtotime($b);

    if ($va != $vb) {
        return $va < $vb ? -1 : 1;
    }
    return 0;
}

// first pass (sort outer elements)
uksort($data, 'timeCompare');
// second pass (sort inner elements)
foreach ($data as &$item) {
    uasort($item, function($a, $b) {
        return timeCompare($a['start_time'], $b['start_time']);
    });
}
函数时间比较($a,$b)
{
$va=标准时间($a);
$vb=标准时间($b);
如果($va!=$vb){
返回$va<$vb?-1:1;
}
返回0;
}
//第一遍(对外部元素进行排序)
uksort($data,'timeCompare');
//第二遍(对内部元素进行排序)
foreach($data as&$item){
uasort($item,function($a,$b){
返回时间比较($a['start\u time'],$b['start\u time']);
});
}

这将按照您要求的方式进行排序

$sort = array();
foreach ($d as $key => $item) {
    $sort[$key] = strtotime($key);
}
array_multisort($sort, SORT_ASC, $d);

function sortme($a, $b) {
    return strtotime($a['date']) - strtotime($b['date']);
}

foreach ($d as $k => $i) {
    usort($i, "sortme");
}
返回:

Array
(
    [May 31, 2014] => Array
        (
            [769349] => Array
                (
                    [date] => May 31, 2014
                    [start_time] => 12:30 AM
                    [end_time] => 03:30 AM
                )

        )

    [June 01, 2014] => Array
        (
            [722107] => Array
                (
                    [date] => June 01, 2014
                    [start_time] => 2:00 AM
                    [end_time] => 03:00 AM
                )

            [117646] => Array
                (
                    [date] => June 01, 2014
                    [start_time] => 12:30 AM
                    [end_time] => 03:30 AM
                )

        )

)


解释
  • 基本上,第一个函数将对日期进行排序
    2014年5月31日/2014年6月1日/ETC
  • 第二步是
    foreach
    循环,它将遍历子数组,并根据日期/时间对它们进行排序
  • 瞧,排序数组:-)

这将按照您要求的方式进行排序

$sort = array();
foreach ($d as $key => $item) {
    $sort[$key] = strtotime($key);
}
array_multisort($sort, SORT_ASC, $d);

function sortme($a, $b) {
    return strtotime($a['date']) - strtotime($b['date']);
}

foreach ($d as $k => $i) {
    usort($i, "sortme");
}
返回:

Array
(
    [May 31, 2014] => Array
        (
            [769349] => Array
                (
                    [date] => May 31, 2014
                    [start_time] => 12:30 AM
                    [end_time] => 03:30 AM
                )

        )

    [June 01, 2014] => Array
        (
            [722107] => Array
                (
                    [date] => June 01, 2014
                    [start_time] => 2:00 AM
                    [end_time] => 03:00 AM
                )

            [117646] => Array
                (
                    [date] => June 01, 2014
                    [start_time] => 12:30 AM
                    [end_time] => 03:30 AM
                )

        )

)


解释
  • 基本上,第一个函数将对日期进行排序
    2014年5月31日/2014年6月1日/ETC
  • 第二步是
    foreach
    循环,它将遍历子数组,并根据日期/时间对它们进行排序
  • 瞧,排序数组:-)


你想按日期排序吗?@Darren是的,先按第一个键的日期排序,然后按键排序。根据开始时间对每个键的值重新排序,这样一切都会井然有序。这是来自数据库吗?如果是这样的话,在你的发现中对它进行分类就足够容易了query@scrowler,它不是来自数据库,这样更简单,而是来自会话变量。这是某种SQL查询的结果吗?我知道您正在寻找一个PHP解决方案,但可能您忽略了一些东西,比如SQL查询本身的排序。再说一次:我不知道这里是否有任何问题,但我只是在和你一起思考;-)那么你想按日期排序吗?@Darren是的,先按第一个键的日期排序,然后按键排序。根据开始时间对每个键的值重新排序,这样一切都会井然有序。这是来自数据库吗?如果是这样的话,在你的发现中对它进行分类就足够容易了query@scrowler,它不是来自数据库,这样更简单,而是来自会话变量。这是某种SQL查询的结果吗?我知道您正在寻找一个PHP解决方案,但可能您忽略了一些东西,比如SQL查询本身的排序。再说一次:我不知道这里是否有任何问题,但我只是在和你一起思考;-)@zynder Sorry yes
$d
是通过(原始数组)解析的数据,也是在2014年6月1日密钥的该部分上,子数组的第一个索引必须是117646,因为它的开始时间是12:30am。@zynder Sorry yes
$d
是通过(原始数组)解析的数据,也是在2014年6月1日密钥的该部分上,子数组的第一个索引必须是117646,因为它的开始时间是12:30am。@zynder我已经用您给定的输入对它进行了测试,它用它生成了正确的输出;请给出反例(同时,检查添加的演示)。是的,我很抱歉杰克。谢谢你们两位,杰克和@darren@zynder,我已经用你们给定的输入对它进行了测试,它用它产生了正确的输出;请给出反例(同时,检查添加的演示)。是的,我很抱歉杰克。谢谢你们,杰克和达伦。