1. Cadenas de Caracteres

En la etapa de diseño, al especificar un pseudocódigo de un algoritmo utilizamos el tipo TEXTO para representar una cadena de caracteres. Una variable de este tipo se declara de la siguiente forma:

  TEXTO mensaje
  mensaje ← ”Ingrese la cantidad de alumnos”
  ESCRIBIR(mensaje)

En este ejemplo, la variable mensaje es de tipo TEXTO. La variable asume un valor particular en la segunda línea a partir de la asignación. Y ese valor, es utilizado para mostrar por pantalla un mensaje al usuario.

  • Cuando queremos representar el literal de un TEXTO, o la cadena de texto en sí, lo escribimos entre doble comillas. Hemos utilizado cadenas de texto con distintos propósitos. Por ejemplo:
  • Cuando queremos mostrar un mensaje en pantalla para indicarle al usuario que ingrese un valor particular.
ESCRIBIR(”Ingrese la cantidad de alumnos”)
  • Cuando queremos producir mensajes m´as precisos. Por ejemplo en el siguiente ejemplo el módulo ejemplo recibe por pantalla un entero i, y muestra los n´umeros naturales desde el uno hasta \(i\).

El mensaje por pantalla produce un mensaje indicando: Número: 1, Número: 2, etc.

MóDULO ejemplo(ENTERO i) RETORNA ;
  (*....*)
  ENTERO x, j
  x ←   1
  PARA j ← 0 HASTA i PASO 1 HACER
      ESCRIBIR("Número: ",x)
      x ← x + 1
  FIN PARA
FIN MóDULO ejRepetirPara

Las cadenas de texto se representan en PHP mediante el tipo de dato string.

2. Cadenas en PHP

En PHP, una cadena de caracteres se representa con el tipo string. Una cadena es una secuencia de caracteres que puede almacenarse en una variable y manipularse mediante funciones específicas. Las variables PHP comienzan con el signo $.

2.1. Declaración en PHP

Una cadena se puede asignar a una variable de la siguiente forma:

<?php
$saludo = "Hola ! ";
?>

o:

<?php
$saludo = "Hola ! ";
?>

También puede asignarse directamente un literal de cadena:

<?php
$saludo = "Hola ! ";
?>

En PHP, las cadenas pueden delimitarse con comillas dobles o simples; las comillas dobles permiten interpolar variables y procesar ciertas secuencias de escape.

2.2. Salida por pantalla

Para mostrar el contenido de una cadena utilizamos la siguiente instrucción:

<?php
echo $saludo;
?>
## 
## Warning: Undefined variable $saludo in F:\backup2023_10_18\ip\dummy.php on line 2

2.3. Concatenación de cadenas

PHP utiliza el operador . (punto) para concatenar cadenas de caracteres. En el siguiente ejemplo el resultado de la concatenación es un nuevo String compuesto por las dos cadenas, una tras otra. Por ejemplo:

<?php
$x = "Problemas " . "y Algoritmos";
?>

da como resultado la cadena “Problemas y Algoritmos”.

Veamos otro ejemplo:

<?php
$saludo = "Hola ";
$sentencia = $saludo . " operador";
echo $sentencia;
?>
## Hola  operador

También es posible concatenar cadenas con valores numéricos. Por ejemplo:

<?php
$i = 5;
$x = " El valor de i es " . $i;
?>

Cuando se usa el operador . con un número, PHP lo convierte a texto para realizar la concatenación. Otro ejemplo:

<?php
$solucion = "La temperatura es " . 72;
echo $solucion;
?>
## La temperatura es 72

2.4. Funciones para cadenas

PHP ofrece funciones para operar con cadenas. Por ejemplo, strlen() retorna la longitud de una cadena en bytes. Para las cadenas ASCII de estos ejemplos, coincide con la cantidad de caracteres.

<?php
$cartel = "Bienvenido a PHP";
$longitudCartel = strlen($cartel);
echo $longitudCartel;
?>
## 16

La salida por pantalla del fragmento de código anterior es: 16.

3. Operaciones con cadenas

A continuaci´on describiremos en forma de tabla diferentes operaciones que pueden realizarse con el tipo TEXTO o cadenas de caracteres. Mostraremos las funciones de PHP equivalentes a las operaciones de cadenas en pseudocódigo. En los ejemplos siguientes se presenta el pseudocódigo junto con su implementación en PHP.

4. Posiciones en una cadena

Nota: los ejemplos de acceso por posición, strlen() y substr() se aplican directamente a cadenas ASCII. Para caracteres Unicode multibyte (como vocales acentuadas) deben utilizarse las funciones mb_* cuando esté disponible la extensión mbstring.

Las variables de tipo TEXTO contienen una cadena de caracteres. Podr´ıamos decir que una variable de tipo TEXTO tiene componentes dentro de s´ı. Estos componentes se encuentran en distintas posiciones comenzando desde 0. Ejemplos: En “PHP es divertido” la “P” está en la posición 0. Otros ejemplos:

<?php
$cartel = "Bienvenido a PHP";
echo $cartel[4];
echo substr($cartel, 3, 6);
?>
## vnvenid

Cuya salida por pantalla es:

v
nvenid

5. Comparación de cadenas

En PHP, === permite comprobar si dos cadenas tienen exactamente el mismo contenido y tipo. Para comparaciones sin distinguir mayúsculas y minúsculas puede utilizarse strcasecmp(). En PHP, == compara valores y permite conversiones automáticas de tipos.

En PHP, para comparar exactamente dos cadenas se utiliza ==. Para compararlas sin distinguir mayúsculas y minúsculas se utiliza strcasecmp().

6. Comportamiento de Cadenas

6.1 Longitud

Retorna la longitud de la cadena de caracteres.

Pseudocódigo

TEXTO saludo
saludo ← "Hola!" 
ESCRIBIR(longitud(saludo)) 
(* salida por pantalla 5)

PHP

<?php
$saludo = "Hola!";
echo strlen($saludo);
// muestra por pantalla 5
?>
## 5

6.2 Igual

Retorna true si el contenido de dos cadenas son iguales, sino retorna false.

Pseudocódigo

TEXTO saludo
LEER(saludo);
SI igual(saludo,"Hola") ENTONCES
  ESCRIBIR("Saludo Informanl")
FIN SI

PHP

<?php
echo "Ingrese un saludo: ";
$saludo = trim(fgets(STDIN));
if ($saludo == "Hola") {
    echo "saludo informal";
}
?>
## Ingrese un saludo:

6.3. strcasecmp

Retorna true si el contenido de cadena1 y de cadena2 son iguales, considerando una letra en mayúscula y minúscula como iguales, sino retorna false.

Pseudocódigo

TEXTO s1
s1 ← "mary" 
ESCRIBIR(igualIgnoreMayúsculas(s1,"Mary"))
(* retorna VERDADERO *)

PHP

<?php
$s1 = "mary";
echo (strcasecmp($s1, "Mary") == 0) ? "TRUE" : "FALSE";
// retorna TRUE
?>
## TRUE

6.4. strtolower

Retorna un String con los mismos caracteres pero convertidos en minúscula.

Pseudocódigo

TEXTO s1
s1 ← "Hola Mary" 
ESCRIBIR(aMinuscula(s1))
(* retorna "hola mary" *)

PHP

<?php
$s1 = "Hola Mary";
echo strtolower($s1);
// muestra por pantalla "hola mary"
?>
## hola mary

6.5. strtoupper

Retorna un String con los mismos caracteres pero convertidos en mayúscula.

Pseudocódigo

TEXTO s1
s1 ← "Hola Mary" 
ESCRIBIR(aMayuscula(s1))
(* retorna "HOLA MARY" *)

PHP

<?php
$s1 = "Hola Mary";
echo strtoupper($s1);
// muestra por pantalla "HOLA MARY"
?>
## HOLA MARY

6.6. trim

Retorna un String con los mismos caracteres que cadena, pero remueve los espacios por delante y detrás

Pseudocódigo

TEXTO pausa
pausa ← " Hmmm "
ESCRIBIR(trim(pausa))
(* muestra "Hmmm" sin espacios *)

PHP

<?php
$pausa = " Hmmm ";
echo trim($pausa);
// muestra "Hmmm" sin espacios
?>
## Hmmm

6.7. Acceso a caracteres por posición

Retorna el carácter que en cadena se encuentra en la posición pos. La posición se cuenta 0, 1, 2, etc.

Pseudocódigo

TEXTO saludo
saludo ← "Hola !"
ESCRIBIR(caracterEnPosicion(saludo,0))
(* muestra 'H'*)
ESCRIBIR(caracterEnPosicion(saludo,3))
(* muestra 'a'*)

PHP

<?php
$saludo = "Hola !";
echo $saludo[0];
// muestra H
echo $saludo[3];
// muestra a
?>
## Ha

6.8. Subcadena

Retorna la subcadena de cadena desde la posición indicada hasta el final.

Pseudocódigo

TEXTO prueba
prueba ← "AbcdefG" ;
ESCRIBIR(subcadena(prueba,2)) 
(* muestra " cdefG")

PHP

<?php
$prueba = "AbcdefG";
echo substr($prueba, 2);
// muestra "cdefG"
?>
## cdefG

6.9 Subcadena entre posiciones

Retorna la subcadena de cadena desde la posición inicial hasta otra posición final sin incluirla.

Pseudocódigo

TEXTO prueba
prueba ← "AbcdefG" ;
ESCRIBIR(subcadena(prueba,2,5)) 
(* muestra "cde")

PHP

<?php
$prueba = "AbcdefG";
echo substr($prueba, 2, 5 - 2);
// muestra "cde"
?>
## cde

6.10. strpos

Retorna la posición de la primer ocurrencia de cadena2 dentro de cadena1. Las posiciones se cuentan 0,1,2, etc. Retorna -1 si cadena2 no existe dentro de cadena1.

Pseudocódigo

TEXTO saludo
saludo ← "Hola Mary"
ESCRIBIR(indiceDe(saludo,"Mary"))
(* retorna 5 *)
ESCRIBIR(indiceDe(saludo,"Sally");
(* retorna -1 *)

PHP

<?php
$saludo = "Hola Mary";
echo strpos($saludo, "Mary");
// muestra 5
$pos = strpos($saludo, "Sally");
echo ($pos == false) ? -1 : $pos;
// muestra -1
?>
## 5-1

6.11. strpos con desplazamiento

Retorna la posición de la primer ocurrencia de cadena2 dentro de cadena1, a partir de la posición ini. Las posiciones se cuentan 0,1,2, etc. Retorna -1 si cadena2 no existe dentro de cadena1.

Pseudocódigo

TEXTO saludo
saludo ← "Hola Mary";
ESCRIBIR(indiceDe(saludo,"Mary",1))
(* muestra 5 *)
ESCRIBIR(indiceDe(saludo,"Mary",8)) 
(* muestra -1 *)

PHP

<?php
$saludo = "Hola Mary";
$pos = strpos($saludo, "Mary", 1);
echo ($pos == false) ? -1 : $pos;
// muestra 5
$pos = strpos($saludo, "Mary", 8);
echo ($pos == false) ? -1 : $pos;
// muestra -1
?>
## 5-1

6.12. strrpos

Retorna la posición de la última ocurrencia de cadena2 dentro de cadena1. Las posiciones se cuentan 0,1,2,etc. Retorna -1 si cadena2 no existe dentro de cadena1.

Pseudocódigo

TEXTO s1
s1 ← "Mary, Mary, Mary no"
ESCRIBIR(ultimoIndiceDe(s1,"Mary"))
(*  retorna 12 *)

PHP

<?php
$s1 = "Mary, Mary, Mary no";
echo strrpos($s1, "Mary");
// muestra 12
?>
## 12

6.13. strcmp

Compara cadena1 con cadena2 de acuerdo a su orden lexicográfico (que es equivalente al alfabético si las letras están todas en minúsculas o mayúsculas). Si el cadena1 es menor que cadena2 devuelve un valor negativo, si son iguales devuelve 0 y si cadena1 es mayor devuelve un número positivo.

Pseudocódigo

TEXTO entrada
entrada ← "aventura"
ESCRIBIR(compararA(entrada,"zoo"))
(* retorna un valor negativo *)
ESCRIBIR(compararA(entrada,"abajo"))
(* retorna un valor positivo *)

PHP

<?php
$entrada = "aventura";
echo strcmp($entrada, "zoo");
// retorna un valor negativo
echo strcmp($entrada, "abajo");
// retorna un valor positivo
?>
## -11

7. Ejemplos

7.1. Recorrido de una cadena

Pseudocódigo

ALGORITMO recorrido() RETORNA ∅
(* solicita al usuario una cadena y obtiene 
   cada uno de sus caracteres*)
  TEXTO cadena
  ENTERO i, lon
  ESCRIBIR("Ingrese una cadena")
  LEER(cadena)
  lon <- longitud(cadena) - 1
  PARA i= 0 HASTA lon  PASO 1 HACER
      ESCRIBIR(caracterEnPosicion(cadena, i))
  FIN PARA
FIN ALGORITMO

PHP

<?php
echo "Ingrese una cadena: ";
$cadena = trim(fgets(STDIN));
$lon = strlen($cadena);
for ($i = 0; $i < $lon; $i++) {
    echo $cadena[$i] . "\n";
}
?>
## Ingrese una cadena:

7.2. Recorrido de una cadena

Pseudocódigo

ALGORITMO recorrido() RETORNA ∅
(* solicita al usuario una cadena y 
   como desea el usuario descomponer 
   la cadena*)
  TEXTO cadena, orden
  ENTERO i, lon
  ESCRIBIR("Ingrese una cadena")
  LEER(cadena)
  ESCRIBIR("Indique en que orden desea 
      descomponer la palabra (normal o inverso):")
  LEER(orden)
  lon <- longitud(cadena) - 1
  SI igual(orden,"normal") ENTONCES
    PARA i= 0 HASTA lon  PASO 1 HACER
      ESCRIBIR(caracterEnPosicion(cadena, i))
    FIN PARA
  SINO
     SI igual(orden,"inverso") ENTONCES
        PARA i= lon HASTA 0  PASO -1 HACER
          ESCRIBIR(caracterEnPosicion(cadena, i))
        FIN PARA
     FIN SI
  FIN SI
FIN ALGORITMO

PHP

<?php
echo "Ingrese una cadena: ";
$cadena = trim(fgets(STDIN));
echo "Indique en qué orden desea descomponer la palabra (normal o inverso): ";
$orden = trim(fgets(STDIN));
$lon = strlen($cadena) - 1;
if ($orden == "normal") {
    for ($i = 0; $i <= $lon; $i++) {
        echo $cadena[$i] . "\n";
    }
} elseif ($orden == "inverso") {
    for ($i = $lon; $i >= 0; $i--) {
        echo $cadena[$i] . "\n";
    }
}
?>
## Ingrese una cadena: Indique en qué orden desea descomponer la palabra (normal o inverso):

7.3. Recorrido Parcial

Problema: Dada una cadena obtener la posición de un caracter en la cadena.

Pseudocódigo


MÓDULO obtenerPosiciónEnCadena(TEXTO cadena, CARACTER carac ) RETORNA ENTERO
  (* devolver la primera posición de un caracter en una cadena, si no lo encuentra retorna -1
   cadena: la cadena a recorrer
   carac: el caracter del cual se desea obtener la posicion en la cadena*)
   ENTERO iter, longitud, pos
   LOGICO encontrado
   pos ← -1
   iter ← 0          
   encontrado ← FALSO
   longitud ← longitud(cadena)
   MIENTRAS ((iter < longitud) AND ! encontrado)  HACER
       SI ( caracterEnPosicion(cadena, iter) = carac )  ENTONCES
            pos ← iter                        
            Encontrado ← VERDADERO  
       SINO 
            iter ← iter+1
       FIN SI   
   FIN MIENTRAS
   RETORNA pos 
FIN MÓDULO principal

ALGORITMO principal() RETORNA ∅
   (* obtener la primera posición de un caracter en una cadena*)
   TEXTO cadena
   CARACTER caracABuscar
   ENTERO posicion
   ESCRIBIR(“Ingrese la cadena de caracteres”)
   LEER(cadena) 
   ESCRIBIR(“Ingrese un caracter del cual se desea obtener su posición en la cadena”)
   LEER(caracABuscar)
   posicion ← obtenerPosiciónEnCadena(cadena, caracABuscar)
   ESCRIBIR(“El caracter ”+ caracABuscar +” esta en la posición: “+ posicion)
FIN ALGORITMO principal

PHP

<?php
function obtenerPosicion($cadena, $e) {
    // Devuelve la primera posición de un carácter, o -1 si no existe.
    $pos = -1;
    $longitud = strlen($cadena);
    $i = 0;
    $encontrado = false;
    while ($i < $longitud && !$encontrado) {
        if ($cadena[$i] == $e) {
            $pos = $i;
            $encontrado = true;
        } else {
            $i++;
        }
    }
    return $pos;
}
echo "Por favor ingrese una cadena: ";
$cadena = trim(fgets(STDIN));
echo "Por favor ingrese un carácter: ";
$carac = trim(fgets(STDIN));
$posicion = obtenerPosicion($cadena, $carac[0] ?? "");
echo "El carácter está en la posición: " . $posicion;
?>
## Por favor ingrese una cadena: Por favor ingrese un carácter: El carácter está en la posición: -1

7.4. Recorrido Total

Problema: ada una cadena obtener la cantidad de ocurrencias de un caracter en la cadena.

Pseudocódigo

MÓDULO cantOcurrencias(TEXTO cadena, CARACTER e) RETORNA ENTERO
  (* obtiene la posición de la ocurrencia de un caracter
  es un ejemplo de un recorrido TOTAL o 
  exhaustivo
  cadena: cadena a evaluar
  e: caracter del cual se desea obtener la 
  cantidad de ocurrencias *)
  ENTERO cant, longitud, i
  cant ← 0
  longitud ← longitud(cadena) -1
  PARA i ← 0 HASTA longitud  PASO 1 HACER
     SI (caracterEnPosicion(cadena, i) = e ) 
     ENTONCES
        cant ←cant + 1
     FIN SI 
  FIN PARA
  RETORNAR cant
FIN MÓDULO cantOcurrencias

ALGORITMO principal() RETORNA ∅
   (* obtener la primera posición de un caracter en una cadena*)
   TEXTO cadena
   CARACTER caracABuscar
   ENTERO posicion
   ESCRIBIR(“Ingrese la cadena de caracteres”)
   LEER(cadena) 
   ESCRIBIR(“Ingrese un caracter del cual 
  se desea obtener su posición en la cadena”)
   LEER(caracABuscar)
   posicion ← obtenerPosiciónEnCadena(cadena, caracABuscar)
   ESCRIBIR(“El caracter ”+ caracABuscar +” esta en la posición: “+ posicion)
FIN ALGORITMO principal

PHP

<?php
function cantOcurrencias($cadena, $e) {
    // Recorrido total: cuenta las ocurrencias del carácter.
    $cant = 0;
    $longitud = strlen($cadena);
    for ($i = 0; $i < $longitud; $i++) {
        if ($cadena[$i] == $e) {
            $cant++;
        }
    }
    return $cant;
}
echo "Por favor ingrese una cadena: ";
$cadena = trim(fgets(STDIN));
echo "Por favor ingrese un carácter: ";
$carac = trim(fgets(STDIN));
echo "La cantidad de ocurrencias es: " . cantOcurrencias($cadena, $carac[0] ?? "");
?>
## Por favor ingrese una cadena: Por favor ingrese un carácter: La cantidad de ocurrencias es: 0

7.5. Orden Lexicográfico

Problema: Obtener el menor nombre en orden lexicográfico, de un número predeterminado de nombres ingresados por el usuario. 

Busqueda Menor Lexicográficamente Ejemplo original en Java (material pendiente de conversión)

7.6. Ejemplo con Módulos

Problema: Solicitar al usuario una cadena de caracteres. Luego obtener:
1. Su Longitud
2. El caracter en la posición 5.
3. Obtener la inversa de la cadena
4. Contar la cantidad de ocurrencias de un caracter en la cadena
5. Verificar la existencia de un caracter
6. Contar la cantidad de vocales en una cadena

El archivo original .java muestra un ejemplo de modularización todavía pendiente de traducción a PHP. No se reemplaza el enlace porque no se proporcionó el código de ese archivo.