【问题标题】:Sort and group array from timestamp从时间戳对数组进行排序和分组
【发布时间】:2014-01-03 23:41:18
【问题描述】:

我有以下数组:

Array
(
    [0] => Array
        (
            [dest_in_id] => 1
            [dest_user_id] => 37251
            [dest_inv_user_id] => 37247
            [dest_timestamp] => 1387168510
            [dest_destination_id] => 64
        )

    [1] => Array
        (
            [gi_in_id] => 3
            [gi_user_id] => 37251
            [gi_inv_user_id] => 14564
            [gi_timestamp] => 1345220045
            [gi_group_id] => 2
        )

    [2] => Array
        (
            [dest_in_id] => 2
            [dest_user_id] => 37251
            [dest_inv_user_id] => 37257
            [dest_timestamp] => 1387168510
            [dest_destination_id] => 64
        )

    [3] => Array
        (
            [gi_in_id] => 3
            [gi_user_id] => 37251
            [gi_inv_user_id] => 14564
            [gi_timestamp] => 1345220045
            [gi_group_id] => 2
        )

)

需要查看每个数组的 Timestamp 差异,如果

Array
(
    [1387168510] => Array
        (
            [0] => Array
                (
                    [dest_in_id] => 1
                    [dest_user_id] => 37251
                    [dest_inv_user_id] => 37247
                    [dest_timestamp] => 1387168510
                    [dest_destination_id] => 64
                )

            [1] => Array
                (
                    [dest_in_id] => 2
                    [dest_user_id] => 37251
                    [dest_inv_user_id] => 37257
                    [dest_timestamp] => 1387168510
                    [dest_destination_id] => 64
                )
        )

    [1345220045] => Array
        (
            [0] => Array
                (
                    [gi_in_id] => 3
                    [gi_user_id] => 37251
                    [gi_inv_user_id] => 14564
                    [gi_timestamp] => 1345220045
                    [gi_group_id] => 2
                )

            [1] => Array
                (
                    [gi_in_id] => 3
                    [gi_user_id] => 37251
                    [gi_inv_user_id] => 14564
                    [gi_timestamp] => 1345220045
                    [gi_group_id] => 2
                )
        )

)

重要提示!键可能不同!

立即求助于函数usort。想做这样的事情:

        usort($aInvitesRows, function($a, $b) {
            $akey = array_keys($a);
            $bkey = array_keys($b);

            if (($b[preg_grep("/(.*?)_timestamp/", $bkey)[3]] - $a[preg_grep("/(.*?)_timestamp/", $akey)[3]]) <= 86400) {
                return $b[preg_grep("/(.*?)_timestamp/", $bkey)[3]] =  array($a, $b);
            }
        });

这次冒险的成功没有加冕:( 在这个阶段,使用usort只能按时间戳(*)排序,你是做什么的 - 不知道,地址寻求帮助!

*

        usort($aInvitesRows, function($a, $b) {
            $akey = array_keys($a);
            $bkey = array_keys($b);

            return strcmp($b[preg_grep("/(.*?)_timestamp/", $bkey)[3]], $a[preg_grep("/(.*?)_timestamp/", $akey)[3]]);
        });

【问题讨论】:

    标签: php arrays sorting timestamp


    【解决方案1】:
    function msort($array, $key, $sort_flags = SORT_REGULAR) {
            if (is_array($array) && count($array) > 0) {
                if (!empty($key)) {
                    $mapping = array();
                    foreach ($array as $k => $v) {
                        $sort_key = '';
                        if (!is_array($key)) {
                            $sort_key = $v[$key];
                        } else {
                            // @TODO This should be fixed, now it will be sorted as string
                            foreach ($key as $key_key) {
                                $sort_key .= $v[$key_key];
                            }
                            $sort_flags = SORT_STRING;
                        }
                        $mapping[$k] = $sort_key;
                    }
                    asort($mapping, $sort_flags);
                    $sorted = array();
                    foreach ($mapping as $k => $v) {
                        $sorted[] = $array[$k];
                    }
                    return $sorted;
                }
            }
            return $array;
        }
    

    【讨论】:

    • 这个功能怎么用?
    【解决方案2】:
        $arr = $aInvitesRows;
        $result = array();
        $item = array_shift($arr);
        $akeys = array_keys($item);
        $dt = new \DateTime();
    
        $dt->setTimestamp($item[preg_grep("/(.*?)_timestamp/", $akeys)[3]]);
        $dt->setTime(0, 0, 0);
        $result[$dt->getTimestamp()] = array($item);
        foreach ($arr as $item) {
            $akeys = array_keys($item);
            $f = false;
            foreach ($result as $day => $items) {
    
                $diff = ($item[preg_grep("/(.*?)_timestamp/", $akeys)[3]]) - $day;
                if ($diff < 86400 && $diff > 0) {
    
                    $result[$day][] = $item;
                    $f = true;
                    break 1;
                }
            }
            if (!$f) {
    
                $dt = new \DateTime();
                $dt->setTimestamp($item[preg_grep("/(.*?)_timestamp/", $akeys)[3]]);
                $dt->setTime(0, 0, 0);
                $result[$dt->getTimestamp()] = array($item);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2021-08-02
      • 2020-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多