Recientemente me embarqué en un proyecto personal (que daré a conocer dentro de poco) que implicaba reescribir en PHP código escrito previamente en Javascript.

Al poco de empezar la tarea pude observar que el script dependía de la función slice de Javascript. Miré en la documentación de PHP y ninguna función hacía lo mismo. Consulté las funciones para los arrays…y tampoco ninguna me servía. Finalmente busqué en Google y sólo encontré gente preguntando en foros si existía dicha función en PHP o algún port pero ninguna solución.

Así que me puse manos a la obra, al cabo de un rato escribí los tests y ¡Tachán! os presento la implementación en PHP de la función slice de Javascript para strings exclusivamente ya que el proyecto no requería tratar con arrays.

El comportamiento es idéntico a su “counterpart” en Javascript, de modo que si alguien necesita cambiar qué devuelve la función en caso de una excepción (“” string vacío) tendrá que modificar el código y crear sus tests.

/** 
* PHP port of Javascript's "slice" function
* Author: Tubal Martin http://margenn.com
* Tests: http://margenn.com/tubal/str_slice/
*
* @param string $str
* @param int    $start index
* @param int    $end index (optional)
*/
function str_slice($str, $start, $end = FALSE)
{
    if ($start < 0 || $end <= 0) {
        
        if ($end === FALSE) {
            $slice = substr($str, $start);
            return ($slice === FALSE) ? '' : $slice;
        }
        
        $max = strlen($str);
        
        if ($start < 0) {
            if (($start = $max + $start) < 0) {
                return '';
            }
        }
    
        if ($end < 0) {
            if (($end = $max + $end) < 0) {
                return '';
            }
        }
        
        if ($end <= $start) {
            return '';
        }
    }   
    
    $slice = substr($str, $start, $end - $start);
    return ($slice === FALSE) ? '' : $slice;
}

Podéis ejecutar los tests visitando la URL indicada en el comentario situado en la cabecera de la función.

La función está optimizada para un rendimiento óptimo.

Espero que os sirva de utilidad ;)