1.5Arrays y cadenas de caracteres
Lo esencial en 30 segundos
- Indexado = lista, asociativo = datos nombrados: $tab[0] por posición, $tab['nom'] por clave — elegir según la naturaleza.
- Multidimensional = la forma de la web: lista de filas asociativas — exactamente un resultado de consulta, recorrido en foreach.
- No reinventar: count, in_array, array_map/filter, implode/explode, str_replace, trim… — y mb_* para Unicode.
Minicaso hilado — Riad estructura sus datos en Constantine
Riad recibe la lista de las prestaciones con sus tarifas: primero las guarda en variables separadas $p1, $p2, $p3 — y se lía en cuanto llega la cuarta. Lo reestructura en array asociativo por prestación, y luego en lista multidimensional lista para mostrar en foreach. Sustituye su bucle casero de búsqueda por in_array, su conteo manual por count, y corrige un strlen que cortaba un título acentuado pasando a mb_strlen. Sus datos tienen por fin una forma que crece sin romperse.
Último episodio del caso 1.1-1.4 — Riad estructura sus datos tras las variables, las decisiones, los bucles y las funciones.
1. Los arrays, estructura central
Los arrays son LA estructura de datos de PHP. El array indexado: acceso por índice numérico (desde 0) — $fruits = ['pomme', 'banane']; $fruits[0]. El array asociativo: acceso por una clave textual — $personne = ['nom' => 'Alice']; $personne['nom'] (omnipresente: datos estructurados). Los arrays pueden ser multidimensionales (arrays dentro de arrays — ej. una lista de usuarios). Se recorren con foreach, se cuentan con count(), se añade con $tab[] = valor;.
Riad ordena sus prestaciones en lista de asociativos (nombre + tarifa cada uno): añadir una prestación es añadir una línea — nunca más una variable $p4.
2. Funciones nativas y Unicode
PHP tiene cientos de funciones nativas. Arrays: count, in_array, array_map (transformar), array_filter (filtrar), array_reduce (agregar), implode / explode. Cadenas: strlen, str_replace, substr, trim, str_contains (PHP 8). Reflejo: no reinventar lo que existe (la doc oficial es excelente). Vigilancia Unicode: las funciones clásicas trabajan sobre BYTES (problema con los acentos en UTF-8) — usar las funciones multibyte (mb_strlen, mb_substr).
Riad cuenta con count, busca con in_array, y mide sus títulos acentuados con mb_strlen: tres bucles caseros eliminados, una visualización corregida.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Indexado, asociativo, multidimensional
La forma de los datos web, como Riad para sus prestaciones.
$utilisateurs = [
['nom' => 'Alice', 'age' => 30],
['nom' => 'Bob', 'age' => 25],
];
foreach ($utilisateurs as $u) {
echo htmlspecialchars($u['nom']) . ' ';
}
echo count($utilisateurs); // 2
Lectura: exactamente la forma de un resultado de consulta (lista de filas), recorrida en foreach.
Lección: acceso seguro a las claves con ?? ($tab['cle'] ?? defecto) — nunca una clave ausente sorpresa.
Vocabulario de la sección
- Array indexado
- Colección cuyos elementos son accesibles por un ÍNDICE numérico (desde 0): $fruits = ['pomme', 'banane']; $fruits[0].
Ejemplo sencillo: La lista de los nombres de prestaciones de Riad.
Lo que no es: un asociativo para una simple lista ordenada.
Reflejo: lista homogénea, orden que cuenta = indexado.
- Array asociativo
- Colección cuyos elementos son accesibles por una CLAVE textual: $personne = ['nom' => 'Alice']; $personne['nom']. Omnipresente (datos estructurados).
Ejemplo sencillo: Cada prestación de Riad (nombre + tarifa nombrados).
Lo que no es: $prestation[1] en lugar de $prestation['tarif'].
Reflejo: datos nombrados = claves explícitas.
- Array multidimensional
- Arrays DENTRO de arrays (ej. una lista de usuarios, cada uno un array asociativo); representa datos complejos.
Ejemplo sencillo: El catálogo completo de Riad, listado y luego mostrado.
Lo que no es: variables $p1, $p2, $p3 separadas.
Reflejo: lista de entidades = indexado de asociativos.
- Funciones de arrays/cadenas
- Cientos de funciones nativas: arrays (count, in_array, array_map/filter/reduce, sort, implode/explode…), cadenas (strlen, str_replace, substr, trim, str_contains…).
Ejemplo sencillo: El count y el in_array que sustituyen los bucles caseros de Riad.
Lo que no es: un bucle manual para buscar un valor.
Reflejo: antes de un bucle: ¿existe la nativa?
- Funciones multibyte (mb_)
- Para tratar correctamente Unicode (caracteres acentuados/no latinos): mb_strlen, mb_substr…; las funciones clásicas trabajan sobre bytes (problema en UTF-8).
Ejemplo sencillo: El título acentuado de Riad medido en mb_strlen.
Lo que no es: truncar « référencement » con substr y cortar un carácter.
Reflejo: texto acentuado = mb_* sistemático.
En la práctica — En la práctica — Manipular arrays y cadenas
- Cree un array indexado y un array asociativo; acceda a sus elementos (por índice / por clave) y añada un elemento (`$tab[] = ...`).
- Cree un array multidimensional (ej. una lista de usuarios, cada uno un array asociativo) y recórralo con foreach.
- Use funciones de arrays: count, in_array, array_map (transformar), array_filter (filtrar), implode/explode.
- Manipule cadenas: strlen, str_replace, substr, trim, strtolower; y localice las funciones multibyte (mb_strlen) para Unicode.
Script listo para decir — defender la función nativa (30 s)
« Antes de escribir este bucle, verifiquemos si existe una nativa: in_array busca, array_filter filtra, implode une — probadas, rápidas, legibles. Reservamos nuestro código para la lógica de negocio, no para reescribir lo que PHP ya hace. »
Para decir en revisión de código; abrir php.net sobre la función candidata.
Modelo copiar-pegar — catálogo multidimensional + nativas + mb_*
'Vitrine', 'tarif' => 10000],
['nom' => 'Boutique', 'tarif' => 25000],
];
$catalogue[] = ['nom' => 'Sur mesure', 'tarif' => 50000];
echo count($catalogue); // 3
foreach ($catalogue as $prestation) {
echo htmlspecialchars($prestation['nom']) . ' : ' . $prestation['tarif'] . "\n";
}
$tarifs = array_column($catalogue, 'tarif');
echo in_array(25000, $tarifs) ? 'Tarif present' : 'Absent';
echo mb_strlen('Référencement'); // cuenta justo los acentuados
Catálogo en Constantine
Como Riad: lista de asociativos nombre/tarifa — la visualización en foreach sigue la forma exacta de un futuro resultado de base.
Clave quizá ausente
$prestation['promo'] ?? 'aucune': el acceso seguro evita la advertencia cuando una fila no tiene la clave.
Búsqueda o filtro
in_array para « ¿existe? », array_filter para « ¿cuáles? » — dos nativas en lugar de dos bucles caseros.
Texto acentuado
Títulos en francés obliga: mb_strlen/mb_substr para medir y truncar sin cortar un carácter acentuado.
✓ Buenas prácticas
- Elegir indexado (lista) o asociativo (datos nombrados) según la naturaleza de los datos.
- Acceder con seguridad a las claves (isset, ?? para las claves ausentes).
- Buscar una función nativa antes de escribir un bucle.
✗ Errores frecuentes
- Acceder a una clave ausente sin verificar (advertencia/error).
- Tratar texto acentuado con strlen/substr (bytes) en lugar de mb_*.
- Reescribir a mano lo que una función nativa hace mejor.
Puntos clave
- Los ARRAYS son LA estructura central de PHP: INDEXADOS (índice numérico, `$tab[0]`), ASOCIATIVOS (clave textual, `$tab['nom']`, omnipresentes), MULTIDIMENSIONALES (arrays dentro de arrays).
- PHP tiene CIENTOS de funciones nativas: arrays (count, in_array, array_map/filter/reduce, sort, implode/explode) y cadenas (strlen, str_replace, substr, trim, str_contains).
- REFLEJO: no reinventar lo que existe — antes de escribir un bucle, buscar la función nativa (a menudo más eficaz). La doc oficial PHP es excelente, consultarla.
- Atención a UNICODE: las funciones clásicas (strlen, substr) trabajan sobre BYTES (problema con los acentos/caracteres no latinos en UTF-8); usar las funciones MULTIBYTE (mb_*).
Reto 48h — aplique mañana
Reestructure variables separadas en array (modelo anterior): sustituya un bucle casero por count/in_array/array_filter y un strlen sobre texto acentuado por mb_strlen. Verifique la visualización. 25 minutos bastan.
- Elijo indexado, asociativo o multidimensional según los datos.
- Uso las nativas (count, in_array, array_map/filter, implode/explode).
- Trato Unicode en mb_* y accedo a las claves en ?? seguro.
Preguntas frecuentes
¿Arrays indexados o asociativos: cuándo usar cuál, y cómo emplearlos bien?
Array INDEXADO: acceso por índice numérico — representa una LISTA de elementos de la misma naturaleza (`$couleurs = ['rouge', 'vert', 'bleu']`), cuando el orden cuenta o se recolecta (`$tab[] = ...`). Array ASOCIATIVO: acceso por CLAVE textual que tiene un sentido — representa datos ESTRUCTURADOS (`$utilisateur = ['nom' => 'Alice', ...]`), para una entidad (usuario, producto, fila de base). Muy frecuente en PHP web (`$_POST`, resultados de base). La COMBINACIÓN (multidimensional) es omnipresente: un INDEXADO de ASOCIATIVOS = una lista de entidades, exactamente un resultado de consulta, recorrida con foreach. Buenas prácticas: elegir según la naturaleza, nombrar las claves con claridad, acceder con seguridad (isset, `??`), recorrer con foreach.
¿Por qué apoyarse en las funciones nativas de PHP en lugar de programarlo todo uno mismo?
AHORRO DE TIEMPO (in_array en una llamada vs un bucle), FIABILIDAD (probadas por millones de usos, casos límite gestionados), RENDIMIENTO (implementadas en C, rápidas), LEGIBILIDAD (`array_filter($users, ...)` dice la intención), ESTÁNDAR (conocidas por todos). Categorías: cadenas, arrays, fechas, matemáticas, archivos, validación. El reflejo: ANTES de escribir un bucle, preguntar « ¿existe una nativa? » y consultar php.net. Reserve su código para su LÓGICA DE NEGOCIO.
¿Cuál es la estructura de datos central de PHP?