Teniendo en cuenta datos de muestra como:
$str1 = "apple"; $str2 = "pal"; Quiero devolver una respuesta true solo si todos los caracteres [caracteres alfabéticos] de $str2 también están presentes en $str1 , de lo contrario, false .
Dado que todas las letras p , a y l existen en $str1 , el resultado debe ser true .
Si $str2 fuera pole , entonces p , l y e se encontrarían, pero o no. Este escenario debería devolver false .
Mi pseudocódigo es:
if (str2 is present in str1){ // true; // since all characters of str2 are also in str1, so it should return true. } else{ // false; }Utilice la primera cadena (cadena de la lista blanca) como máscara para trim() . Esto eliminará todos los caracteres coincidentes de la segunda cadena. Si quedan caracteres después del recorte, entonces false .
ya que todos los caracteres de str2 también están en str1, por lo que debería devolver verdadero
Código: ( Demostración )
$str1 = "apple"; $str2 = "pal"; $str3 = "pole"; var_export(!strlen(trim($str2, $str1))); echo "\n---\n"; var_export(!strlen(trim($str3, $str1)));Producción:
true --- false Esta respuesta es limpia y directa porque no necesita generar matrices temporales para una comparación posterior. La máscara de caracteres de trim() ofrece la misma acción por la que str_replace() es famoso, pero sin necesidad de dividir primero la cadena de la lista blanca en una matriz. No sé si ltrim() o rtrim() serían más rápidos (a nivel microscópico) que trim() , pero cualquiera de estas funciones generará el mismo resultado.
ps Si tiene la garantía de que solo trabajará con letras, entonces puede usar una verificación falsa en lugar de strlen() .
!trim($str2, $str1)Digo esto porque si permitiera números, entonces una cadena recortada que contiene un cero se consideraría falsa y devolvería un resultado incorrecto.
Puede usar la función array_intersect después de dividir cada carácter de una palabra usando la función str_split como:
<?php $a = "Apple"; $b = "pal"; $matched = !empty(array_intersect(str_split($b), str_split($a)));array_intersect devolverá [ p, l ] ignorando 'A' debido a que distingue entre mayúsculas y minúsculas
echo $matched; // true ?>En caso de que desee hacer coincidir ignorando el caso de los caracteres, primero puede escribir en minúsculas la palabra usando la función strtolower : y luego dividir como:
$a = "Apple"; $a = strtolower($a);Puede usar count_chars() para obtener una matriz de caracteres presentes en cada cadena y luego comparar esas dos matrices:
$s1 = 'apple'; $s2 = 'pal'; $c1 = count_chars($s1, 1); $c2 = count_chars($s2, 1); $ok = empty(array_diff_key($c2, $c1));