PHP: Array, nombre y extensión
![](/media/cache/d0/72/d0724640bcd953438110dddb9fdae6b1.jpg)
Siempre hay una típica función que se reutiliza para cantidad de proyectos y se puede mejorar notablemente. En este caso se trata de separar nombre y extensión de un fichero. Nada del otro mundo pero podemos llegar a hacer verdaderas locuras para ello:
En el caso más simple casi cualquier cosa valdría:
$file="nombre.jpg";
$extension = array_pop(explode('.',$file)); // Sacaría "jpg"
$nombre = array_shift(explode('.',$file)); // Sacaría "nombre"
Pero las disertaciones fueron un poco más allá. Suponiendo otro nombre de archivo un poco más tocapelotas -nombre.apellido.jpg- ya no valdría dicha funcionalidad. Y ahí empezó el dilema.
Una solución válida -aunque no del todo, ahora veremos el motivo- podría ser esta que propuso Mamel.
$a = array(
'a' => substr($file, 0, strlen($file)-4),
'e' => substr($file, 0, -3),
)
Enseguida nos dimos cuenta de que una suposición podría tirar al traste con el array: ¿y si la extensión tiene más de 3 caracteres?. El jpeg existe, entre muchas otras.
También Nacho (próximamente enlace a su blog) aportó su granito de arena:
$a = array (
'a' => substr($file, 0, strpos('.',$file)),
'e' => substr($file, strpos('.',$file)+1, strlen($file)),
)
Pero nos seguía pareciendo demasiado complicado para el cometido. Tenía que haber algo más sencillo en PHP.
Y así llegamos a la refinitiva (solo a partir de php 5.2 saca filename, antes de ésta versión solo informa de la ruta y extensión):
$file2 = pathinfo($file);
Array
(
[dirname] => .
[basename] => nombre.apellido.jpg
[extension] => jpg
[filename] => nombre.apellido
)
Y en caso de no tener php 5.2 siempre podemos partir de la extensión para sacar el resto de información que nos falta:
$file3 = basename($file, '.'.$file2['extension']);
Múltiples formas de solucionar un pequeño entuerto en PHP. Todas correctas y unas más acertadas que otras.