Helper Convert.
Funciones de conversión de datos

Code Helper

Helpers – Converts – Conversiones de datos

Librería donde el propósito es convertir datos en diferentes formatos, tipos u otros parámetros.

/**
 * HelperConvert.php
 * @author      Code Develium
 */

namespace Helpers;

use DateTimeZone;
use Exception;

/**
 * Class HelperConvert
 */
abstract class HelpConvert
{

    /**
     * Transforma un string SI/NO-YES/NO-Y/S-S/N-1/0 a bool.
     * Si el valor está vacío o null, devuelve null.
     * Devuelve null si no se puede convertir a true o false.
     *
     * @param string $str_bool
     *
     * @return bool
     */
    public static function toBool($str_bool)
    {
        $ret = -1;
        if (HelpValidate::isEmpty($str_bool)) {

            $ret = null;

        } else {

            if (is_string($str_bool)) {

                $name = strtolower(strtr($str_bool, 'ÍÓíó', 'ioio'));

                $sn = preg_replace( '/^[:alnum:]/ui', 
                                    '', 
                                    strtoupper(trim($name)));

                if ( $sn == 'S' || 
                     $sn == 'Y' || 
                     $sn == 'SI' || 
                     $sn == 'YES' || 
                     $sn == '1') {

                    $ret = true;

                } else {

                    if ($sn == 'N' || $sn == 'NO' || $sn == '0') {
                        $ret = false;
                    } else {
                        $ret = null;
                    }
                }
            } else {
                if (is_numeric($str_bool)) {

                    if ($str_bool === 1) {

                        $ret = true;

                    } else {

                        if ($str_bool === 0) {
                            $ret = false;
                        } else {
                            $ret = null;
                        }
                    }
                } else {

                    if (is_bool($str_bool)) {
                        return $str_bool;
                    }
                }
            }
        }
        return $ret;
    }

    /**
     * Convierte un valor a un array.
     * Siempre devuelve un array.
     *
     * @param $element
     *
     * @return array
     */
    public static function toArray($element): array
    {
        if (is_array($element)) {
            return $element;

        } elseif (HelpValidate::isEmpty($element)) {
            // No aseguramos que no tenga valor
            return [];

        } elseif (is_object($element)) {

            return ( array )$element;

        } else {
            return array($element);
        }
    }

    /**
     * Devuelve un texto sin especiales HTML y sustitutyendo los CRLF
     * por <br />
     * Si es blanco o null devuelve '&nbsp;'
     *
     * @param $txt
     *
     * @return string
     */
    public static function toHtml($txt)
    {
        if (HelpValidate::isEmpty($txt)) {
            return '&nbsp;';
        }
        return nl2br(htmlspecialchars($txt));
    }

    /**
     * Devuelve un valor en formato monetario +/- 1.234,00 €.
     * Si el valor esta vació, devuelve null.
     *
     * @param string|int $value
     * @param bool       $simbol
     *
     * @return string
     */
    public static function toCurrencyEuro($value, $simbol = true)
    {
        if (HelpValidate::isEmpty($value)) {
            return null;
        }

        $f = floatval($value);

        $sSimbol = $simbol ? ' €' : '';

        if (empty($f)) {
            return '0,00'.$sSimbol;
        }

        if ($f >= 0) {
            $sSigno = '';
        } else {
            $f      *= (-1);
            $sSigno = '-';
        }

        $t = number_format($f, 2, ',', '.');

        return $sSigno.$t.$sSimbol;
    }

    /**
     * Convierte una TimStamp en una fecha.
     * Formato fecha: yyyy-mm-dd
     *
     * @param int $timestamp
     *
     * @return string
     */
    public static function timeStamp2Date($timestamp)
    {
        $date_str = getdate($timestamp);

        $year = $date_str[ "year" ];
        $mon  = $date_str[ "mon" ];
        $day  = $date_str[ "mday" ];

        return sprintf("%4d-%02d-%02d", $year, $mon, $day);
    }

    /**
     * Convierte un timestamp en una fecha y hora
     * Fomato fecha: yyyy-mm-dd hh:mm:ss
     *
     * @param int $timestamp
     *
     * @return string
     */
    public static function timeStamp2DateTime($timestamp)
    {
        $date_str = getdate($timestamp);

        $year = $date_str[ "year" ];
        $mon  = $date_str[ "mon" ];
        $mday = $date_str[ "mday" ];
        $h    = $date_str[ "hours" ];
        $m    = $date_str[ "minutes" ];
        $s    = $date_str[ "seconds" ];

        return sprintf( "%4d-%02d-%02d %02d:%02d:%02d", 
                        $year, $mon, $mday, 
                        $h, $m, $s);
    }

    /**
     * Convierte una hora, minutos y segundo en segundos
     *
     * @param $time
     *
     * @return int
     */
    public static function toSecs($time)
    {
        if (HelpValidate::isTime($time)) {

            $arrTime = explode(":", $time);

            settype($arrTime[ 0 ], "integer");
            settype($arrTime[ 1 ], "integer");
            settype($arrTime[ 2 ], "integer");

            $seconds = ($arrTime[ 0 ] * pow(60, 2));
            $seconds += (($arrTime[ 1 ] * 60) + $arrTime[ 2 ]);

            return $seconds;
        } else {
            return 0;
        }
    }

    /**
     * Convierte un string en un double.
     * El separador decimales en el string es la coma
     * Los miles no llevan punto.
     *
     * @param $txt
     *
     * @return float
     */
    public static function string2Double($txt)
    {
        /*  Cambiamos la coma decimal por el punto */
        return doubleval(str_replace(',', '.', $txt));
    }

    /**
     * Separa una frase a un array donde cada palabra es una posición
     *
     * @param string $str
     *
     * @return array
     */
    public static function string2ArrayWord($str)
    {
        return preg_split('/ /', $str, -1);
    }

    /**
     * Trasnforma un string en un array donde cada caracter es una
     * posición
     *
     * @param string $str
     *
     * @return array
     */
    public static function string2ArrayChar($str)
    {
        return preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
    }


    /**
     * Devuelve un string en formato decimal de un numero.
     * Por defecto no muestra decimales, separador miles el punto.
     * Puede redondear.
     *
     * @param int|double $num
     * @param int        $decimales
     * @param bool       $redondear
     *
     * @return string
     */
    public static function number2String( $num, 
                                          $decimales = 0, 
                                          $redondear = true)
    {
        $sSepDecimals = '';
        if ($decimales != 0) {
            $sSepDecimals = ',';
        }
        $sSepMiles = '.';
        if (empty($num)) {
            return '0';
        }
        if (!$redondear) {
            return number_format( $num, 
                                  $decimales, 
                                  $sSepDecimals, 
                                  $sSepMiles);
        }
        $str = number_format( $num, 
                              $decimales + 1, 
                              $sSepDecimals, 
                              $sSepMiles);
        return substr($str, 0, strlen($str) - 1);
    }

    /**
     * Devuelve un valor numérico como BYTES
     *
     * @param int $size
     *
     * @return string
     */
    public static function number2Bytes($size)
    {
        $match    = null;
        $suffixes = array(
            ''  => 1,
            'k' => 1024,
            'm' => 1048576, /* 1024 * 1024 */
            'g' => 1073741824, /* 1024 * 1024 * 1024 */
        );
        if (preg_match( '/([0-9]+)\s*(k|m|g)?(b?(ytes?)?)/i', 
                        $size, 
                        $match)) {

            return $match[ 1 ] * $suffixes[ strtolower($match[ 2 ]) ];
        }

        return '';
    }

    /**
     * Muestra el valor string 0 per un valor null, vacio o zero
     *
     * @param string $str
     *
     * @return string
     */
    public static function empty2Zero($str)
    {
        return HelpValidate::isEmpty($str) ? '0' : $str;
    }

    /**
     * En lugar de mostrar el zero, null o vacío, muestra un espacio
     * en blanco
     *
     * @param int $val
     *
     * @return string
     */
    public static function empty2Nbsp($val)
    {
        return HelpValidate::isEmpty($val) ? '&nbsp;' : $val;
    }

    /**
     * Decodifica los caracteres especiales a html
     * &quot; => "
     *
     * @param $txt
     *
     * @return string
     */
    public static function decodeEntities($txt)
    {
        return html_entity_decode($txt);
    }

    /**
     * Devuelve la fecha y hora (yyyy-mm-dd hh:mm:ss) partiendo de una
     * fecha en formato UTC
     * Formato UTC:  20070724T224556Z
     *
     * @param string $fechaUtc
     *
     * @return string
     */
    public static function dateUTC2DateTime($fechaUtc)
    {
        $utcdiff = date('Z', time()); /* Diferencia UTC en segundos */

        /* UTC = 20070724T224556Z */
        $y = (int)substr($fechaUtc, 0, 4);
        $m = (int)substr($fechaUtc, 4, 2);
        $d = (int)substr($fechaUtc, 6, 2);
        $h = (int)substr($fechaUtc, 9, 2);
        $i = (int)substr($fechaUtc, 11, 2);
        $s = (int)substr($fechaUtc, 13, 2);

        $stamp = mktime($h, $i, $s, $m, $d, $y);

        $stamp += $utcdiff;

        return date('Y-m-d H:i:s', $stamp);
    }

    /**
     * Convierte una fecha y hora (GMT) en otra en función de una zona 
     * horaria
     *
     * @param string $datetime
     * @param string $time_zone
     *
     * @return string
     * @throws Exception
     */
    public static function dateTime2TimeZone( $datetime, 
                                        $time_zone = 'Europe/Madrid')
    {
        if (HelpValidate::isEmpty($datetime)) {
            return '';
        }

        if (strlen($datetime) == 16) {
            $datetime .= ':00';
        }

        $offset = 0;

        $usuario_timezone = new DateTimeZone($time_zone);
        try{
            $fecha = new \DateTime($datetime, $usuario_timezone);
        } catch (Exception $e){
            throw $e;
        }

        $offset = $usuario_timezone->getOffset($fecha);

        return HelpDateTime::sumarMinutos($datetime, $offset);

    }

    /**
     * Devuevle sólo la fecha de una fecha y hora
     * Formato fecha: yyyy-mm-dd
     *
     * @param $fecha_hora
     *
     * @return string
     */
    public static function dateTime2Date($fecha_hora)
    {
        if (strrpos($fecha_hora, ' ') === false) {
            return null;
        }
        list($dt,) = explode(' ', $fecha_hora);
        return $dt;
    }

    /**
     * Convierte una fecha Std en timestamp, 15/05/2020 => 1273874400
     * Formato fecha: yyyy-mm-dd
     *
     * @param $fecha
     *
     * @return int
     */
    public static function date2TimeStamp($fecha)
    {
        $hours   = 0;
        $minutes = 0;
        $seconds = 0;
        list($year, $month, $day) = explode("-", $fecha);

        return mktime( $hours, $minutes, $seconds, 
                       $month, $day, $year);
    }

    /**
     * Devuelve el dia de la fecha en formato texto 
     * (lunes, 23 de enero del 2009)
     * Formato fecha: yyyy-mm-dd
     *
     * @param $fecha
     *
     * @return string
     */
    public static function date2Text($fecha)
    {
        $arrDias = array('Domingo',
            'Lunes',
            'Martes',
            'Miercoles',
            'Jueves',
            'Viernes',
            'Sábado');

        $arrMeses = array(
            'Enero',
            'Febrero',
            'Marzo',
            'Abril',
            'Mayo',
            'Junio',
            'Julio',
            'Agosto',
            'Septiembre',
            'Octubre',
            'Noviembre',
            'Diciembre'
        );

        list($anio, $mes, $dia) = explode('-', $fecha);

        $wd = date('w', mktime(0, 0, 0, $mes, $dia, $anio));

        return $arrDias[ $wd ].", ".$dia." de " . 
               $arrMeses[ $mes - 1 ]." del ".$anio;
    }

    /**
     * Muestra la fecha en función de un formato.
     * No compruba si la fecha es correcta
     * Formato de fecha: yyyy-mm-dd
     *
     * @param        $date
     * @param string $formato_mostrar
     *
     * @return string
     */
    public static function date2Format( $date, 
                                      $formato_mostrar = 'dd/mm/yyyy')
    {
        if (HelpValidate::isEmpty($date)) {
            return '';
        }
        /* El formato de fecha de entrada es yyyy-mm-dd */
        list($y, $m, $d) = explode('-', $date);

        switch ($formato_mostrar) {
            case 'dd/mm/yyyy':
                return "$d/$m/$y";

            case 'mm/dd/yyyy':
                return "$m/$d/$y";

            case 'yyyy/mm/dd':
                return "$y/$m/$d";

            case 'dd-mm-yyyy':
                return "$d-$m-$y";

            case 'mm-dd-yyyy':
                return "$m-$d-$y";

            case 'yyyy-mm-dd':
                return "$y-$m-$d";

            case 'dd.mm.yyyy':
                return "$d.$m.$y";

            case 'mm.dd.yyyy':
                return "$m.$d.$y";

            case 'yyyy.mm.dd':
                return "$y.$m.$d";

            default:
                return $date;
        }
    }

    /**
     * Devuelve un fecha y hora en formato UTC partiendo de una fecha 
     + yyyy-mm-dd
     * Format utc: YYYYMMDDTHHiissZ
     *
     * @param string $fecha
     *
     * @return string
     */
    public static function date2DateUTC($fecha)
    {
        $utcdiff = date('Z', time()); /* Diferencia UTC en segundos */
        list($anio, $mes, $dia) = explode('-', $fecha);
        $stamp = mktime(0, 0, 0, $mes, $dia, $anio);
        $stamp -= $utcdiff;
        return date('Ymd\THi\0\0\Z', $stamp);
    }

    /**
     * Devuelve un datetime partiendo de una fecha yyy-mm-dd  y una 
     * hora, minutos, y segundos.
     *
     * @param string $fecha
     * @param int    $hora
     * @param int    $minutos
     * @param int    $segundos
     *
     * @return string
     */
    public static function date2DateTime( $fecha, 
                                          $hora = 0, 
                                          $minutos = 0, 
                                          $segundos = 0)
    {
        return $fecha.' '.substr('00'.$hora, -2).':'
            .substr('00'.$minutos, -2).':'
            .substr('00'.$segundos, -2);
    }


    /**
     * Sustitule el tab <br> html por un \n
     *
     * @param $str
     *
     * @return string
     */
    public static function br2nl($str)
    {
        if (empty($str)) {
            return $str;
        }
        preg_match_all("#<[^>]+br.+?>#i", $str, $matches);

        foreach ($matches[ 0 ] as $match) {
            $str = str_replace($match, "<br>", $str);
        }

        $brs = array('<br>', '<br/>', '<br />');
        $str = str_replace("\r\n", "\n", $str);
        $str = str_replace("\n\r", "\n", $str);
        $str = str_replace("\r", "\n", $str);
        $str = str_ireplace($brs, "\n", $str);

        return $str;
    }

    /**
     * Devuelve el literal SI o NO en función de un valor booleano
     * Devuelve '' si el valor esta vacio
     *
     * @param $valor
     *
     * @return string
     */
    public static function bool2YesNo($valor)
    {
        if ($valor === '' || is_null($valor)) {
            return '';
        }
        if ($valor == true || $valor == 1) {
            return 'Sí';
        } else {
            if ($valor == false || $valor == 0 || empty($valor)) {
                return 'No';
            } else {
                return $valor;
            }
        }
    }


}

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.