2012-04-30 22 views
5

Quiero ser capaz de hacer algo le gusta esto:Buscar todas las cartas no usados ​​en una cadena

$str="abc"; 
echo findNot($str); //will echo "defghijklomnopqrstuvwxyz" 
$str2="happy birthday"; 
echo findNot($str2); //will echo "cfgjklmnoqsuvwxz" 

Básicamente, sería encontrar todas las letras que no están representados en la cadena y devolverlos en una matriz o cadena.

Pude hacer esto fácilmente con un foreach y matrices de caracteres, pero me preguntaba si alguien tenía una solución más elegante.

+1

"feliz cumpleaños" dosis no tiene una "e" en ella :-P –

+0

@Rocket cierto ... – diracdeltafunk

Respuesta

5

Esto es lo que se me ocurrió.

function findNot($str){ 
    return array_diff(range('a','z'), array_unique(str_split(strtolower($str)))); 
} 
+0

¡Gracias, esto funciona! – diracdeltafunk

+0

No hay problema. Me alegro de poder ayudar. :-) –

+0

Dios, ojalá pudiera aceptar dos respuestas – diracdeltafunk

4

¿Qué tal esto

$str="abc"; 
var_dump(findNot($str)); 

function findNot($string) 
{ 
    $letters = range('a', 'z'); 
    $presents = array_map(function($i) { return chr($i); }, array_keys(array_filter(count_chars($string)))); 

    return array_diff($letters, $presents); 
} 

PS: implode el resultado si necesita una cadena de caracteres, no matriz

PPS: no está seguro de si se trata de una solución "más elegante" :-)

PPA: otra solución que podía pensar es

$str="abc"; 
var_dump(findNot($str)); 

function findNot($string) 
{ 
    $letters = range('a', 'z'); 
    $presents = str_split(count_chars($string, 4)); 
    return array_intersect($letters, $presents); 
} 
+0

cuando se prueba en phptester. net, obtengo este error: 'Error de análisis: error de sintaxis, inesperado T_FUNCTION, esperando ')' en /home/jabouzic/public_html/phptester.net/txt/c6e64dbae6ae8ca4d0cfe6639f624fb9-67.176.58.205_1.php5 en la línea 8' – diracdeltafunk

+0

@ Ben7005 : Eso es porque las funciones anónimas solo funcionan en PHP 5.3+. No hay muchos probadores de PHP en línea compatibles con 5.3. –

+0

@ Ben7005: porque usa las características de php5.3. De todos modos, agregó uno más corto, que funcionaría con versiones anteriores – zerkms

0

SOLUTIO de Zerk n es bueno. Se me ocurrió este ejemplo similar, no tan elegante.

<?php 

$alphabet = 'abcdefghijklmnopqrstuvwxyz'; 
$alphabet = preg_split('//', $alphabet, -1, PREG_SPLIT_NO_EMPTY); 

$str="abc"; 
var_dump(findNot($str)); //will echo "defghijklomnopqrstuvwxyz" 
$str2="happy birthday"; 
var_dump(findNot($str2)); //will echo "cfgjklmnoqsuvwxz" 

function findNot($str) 
{ 
    global $alphabet; 

    $str = str_replace(' ', '', $str); 
    $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY); 
    $chars = array_unique($chars); 
    sort($chars); 

    $diff = array_diff($alphabet, $chars); 

    return $diff; 
} 
3

se podría hacer algo como esto:

$text = 'abcdefghijklmnop'; 
$search = array('a','b','c'); 

$result = str_replace($search, '', $text); 
+0

Gran idea por cierto - para reemplazar todos los caracteres de cadena en un alfabeto – zerkms

+0

sí, estoy de acuerdo. no es exactamente lo que estoy buscando, tendría que convertir el texto en n array (sé que es una función incorporada ...) – diracdeltafunk

+0

Puedes usar 'str_split' (y' array_unique') para convertir la cadena a una matriz, y 'implosión ('', rango ('a', 'z'))' para hacer el alfabeto :) –

Cuestiones relacionadas