php好用的方法

<?php

namespace app\common\library;
//非标准的base64类
class Base64
{
    private static $hashTable = 'aD1cOrFAx3HXejRYwG4o9*SPW5ZibBt6Csd2Q/Ek7Vu0NJ8ymThvKpULfMIgqlnz';

    //$base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';////标准base64算法

    /**
     * 编码
     * @param string $s 需要加密的字符串
     * @return string
     */
    public function encode($s)
    {
        $base64hash = self::$hashTable;
        $i = 0;
        $prev = 0;
        $result = [];
        while ($i < strlen($s)) {
            $ascii = ord($s[$i]);
            $mod = $i % 3;
            switch ($mod) {
                case 0: // 第一个6位只需要让8位二进制右移两位
                    $result[] = $base64hash[$ascii >> 2];
                    break;
                case 1://第二个6位 = 第一个8位的后两位 + 第二个8位的前4位
                    $result[] = $base64hash[($prev & 3) << 4 | ($ascii >> 4)];
                    break;
                case 2: //第三个6位 = 第二个8位的后4位 + 第三个8位的前2位 , 第4个6位 = 第三个8位的后6位
                    $result[] = $base64hash[($prev & 0x0f) << 2 | ($ascii >> 6)];
                    $result[] = $base64hash[$ascii & 0x3f];
                    break;
            }
            $prev = $ascii;
            $i++;
        }
        // 循环结束后看mod, 为0 证明需补3个6位,第一个为最后一个8位的最后两位后面补4个0。另外两个6位对应的是异常的“=”;
        // mod为1,证明还需补两个6位,一个是最后一个8位的后4位补两个0,另一个对应异常的“=”
        if ($mod == 0) {
            $result[] = $base64hash[($prev & 3) << 4];
            $result[] = '==';
        } else if ($mod == 1) {
            $result[] = $base64hash[($prev & 0x0f) << 2];
            $result[] = '=';
        }
        return implode('', $result);
    }

    /**
     * 解码
     * @param string $s 需要解密的字符串
     * @return string
     */
    public function decode($s)
    {
        $s = preg_replace("/\s|=/", '', $s);
        $base64hash = self::$hashTable;
        $i = 0;
        $prev = 0;
        $result = [];
        while ($i < strlen($s)) {
            $cur = strpos($base64hash, $s[$i]);
            $mod = $i % 4;

            switch ($mod) {
                case 0://TODO
                    break;
                case 1:
                    $result[] = chr($prev << 2 | $cur >> 4);
                    break;
                case 2:
                    $result[] = chr(($prev & 0x0f) << 4 | $cur >> 2);
                    break;
                case 3:
                    $result[] = chr(($prev & 3) << 6 | $cur);
                    break;
            }
            $prev = $cur;
            $i++;
        }
        return implode('', $result);
    }
}

//计算2个坐标直接的距离

/*
 * 获取2个坐标直接的距离
 * */
function get_distance($lat1, $lng1, $lat2, $lng2)
{
    $earthRadius = 6367000; //地球半径m

    $lat1 = ($lat1 * pi() ) / 180;
    $lng1 = ($lng1 * pi() ) / 180;

    $lat2 = ($lat2 * pi() ) / 180;
    $lng2 = ($lng2 * pi() ) / 180;

    $calcLongitude = $lng2 - $lng1;
    $calcLatitude = $lat2 - $lat1;
    $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
    $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
    $calculatedDistance = $earthRadius * $stepTwo;

    return round($calculatedDistance);
}

 

posted @ 2023-03-29 17:51  孤独的DNA  阅读(26)  评论(0)    收藏  举报