Cita:
Iniciado por Erickvk Mi recorrido es mas eficiente ya que recorre el minimo de veces los elementos de formulario, y la i y la j nunca valen lo mismo, ya que se inicializa la j con i+1.
Lo siento
Erickvk, interpreté mal tu código. Tienes razón en que el tuyo es más eficiente, es mucho más
He codigo la idea y lo he implementado en el mío:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<meta name="Author" content="derkeNuke" />
<title>Página nueva</title>
<style type="text/css">
</style>
</head>
<body>
<form action="">
0. <input type="text" value="bar" /><br/>
1. <input type="text" value="bara" /><br/>
2. <input type="text" value="barb" /><br/>
3. <input type="text" value="barc" /><br/>
4. <input type="text" value="bard" /><br/>
5. <input type="text" value="foo" /><br/>
6. <input type="text" value="fooa" /><br/>
7. <input type="text" value="foob" /><br/>
8. <input type="text" value="fooc" /><br/>
9. <input type="text" value="food" /><br/>
10. <input type="text" value="fooe" /><br/>
11. <input type="text" value="foof" /><br/>
12. <input type="text" value="foog" /><br/>
<button type="button" onclick="comprobarRepetidos(this.form)">comprobarRepetidos()</button>
</form>
<script type="text/javascript">
<!--
function comprobarRepetidos(fr) {
var elementos = fr.elements;
var nElementos = elementos.length;
var strFinal = "";
for(var i=0; i<nElementos-1; i++) { // comprobamos cada campo
for(var j=i+1; j<nElementos; j++) { // con cada campo
if( i!=j && elementos[i].tagName.toUpperCase()=="INPUT" && elementos[i].tagName.toUpperCase()=="INPUT" &&
elementos[i].type.toUpperCase()=="TEXT" && elementos[j].type.toUpperCase()=="TEXT" ) {
if( elementos[i].value == elementos[j].value ) {
strFinal += "El campo número "+i+" se repite con el número "+j+". Cambie alguno de los dos.\n\r";
}
}
}
}
if( strFinal == "" ) {
alert("No hubo ningún campo repetido");
}
else {
alert("Hubo los siguientes errores: \n\r" + strFinal );
}
}
// -->
</script>
</body>
</html>
78 comprobaciones para 12 campos en vez de 130 que hacía antes. Es una buena mejora.
Hemos salvado el escollo a la hora de que se repitan dos campos, aunque todavía es un poco incómodo cuando se repiten tres (de cuatro o más ni hablamos).
He puesto 55 campos solo para comprobar el rendimiento... una media de 350ms para la función, 1540 comprobaciones. No está mal el rendimiento, contando que tienes 30 campos y que no vas a meter más código en mi ejemplo.
He investigado las soluciones que te puse, sobre todo la de las expresiones regulares es la que más me llama la atención (cómo no). Con 55 campos en la misma máquina me ha tardado en ejecutar una media de 20ms, extremadamente rápido. El handicap que tiene es que es un poco más dificil encontrar en qué campos están los errores, exigiría más código (supongo que no empeoraría mucho el rendimiento).
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<meta name="Author" content="derkeNuke" />
<title>Página nueva</title>
<style type="text/css">
</style>
</head>
<body>
<form action="">
0. <input type="text" value="barr" /><br/>
1. <input type="text" value="barat" /><br/>
2. <input type="text" value="barbn" /><br/>
3. <input type="text" value="barci" /><br/>
4. <input type="text" value="bardo" /><br/>
5. <input type="text" value="foo" /><br/>
6. <input type="text" value="fooaq" /><br/>
7. <input type="text" value="foobq" /><br/>
8. <input type="text" value="foocq" /><br/>
9. <input type="text" value="food" /><br/>
10. <input type="text" value="fooe" /><br/>
11. <input type="text" value="foof" /><br/>
12. <input type="text" value="foog" /><br/>
13. <input type="text" value="bara" /><br/>
14. <input type="text" value="baraa" /><br/>
15. <input type="text" value="barba" /><br/>
16. <input type="text" value="barca" /><br/>
17. <input type="text" value="barda" /><br/>
18. <input type="text" value="fooa" /><br/>
19. <input type="text" value="fooaa" /><br/>
20. <input type="text" value="fooba" /><br/>
21. <input type="text" value="foocaq" /><br/>
22. <input type="text" value="fooda" /><br/>
23. <input type="text" value="fooea" /><br/>
24. <input type="text" value="foofa" /><br/>
25. <input type="text" value="fooga" /><br/>
26. <input type="text" value="barb" /><br/>
27. <input type="text" value="barabn" /><br/>
28. <input type="text" value="barab" /><br/>
29. <input type="text" value="barbb" /><br/>
30. <input type="text" value="barcb" /><br/>
31. <input type="text" value="bardb" /><br/>
32. <input type="text" value="foob" /><br/>
33. <input type="text" value="fooab" /><br/>
34. <input type="text" value="foobb" /><br/>
35. <input type="text" value="foocb" /><br/>
36. <input type="text" value="foodb" /><br/>
37. <input type="text" value="fooeb" /><br/>
38. <input type="text" value="foofb" /><br/>
39. <input type="text" value="foogb" /><br/>
40. <input type="text" value="barc" /><br/>
41. <input type="text" value="baracq" /><br/>
42. <input type="text" value="barac" /><br/>
43. <input type="text" value="barbc" /><br/>
44. <input type="text" value="barcc" /><br/>
45. <input type="text" value="bardc" /><br/>
46. <input type="text" value="fooc" /><br/>
47. <input type="text" value="fooac" /><br/>
48. <input type="text" value="foobc" /><br/>
49. <input type="text" value="foocc" /><br/>
50. <input type="text" value="foodc" /><br/>
51. <input type="text" value="fooec" /><br/>
52. <input type="text" value="foofc" /><br/>
53. <input type="text" value="foogc" /><br/>
54. <input type="text" value="bard" /><br/>
55. <input type="text" value="barad" /><br/>
<button type="button" onclick="comprobarRepetidos(this.form)">comprobarRepetidos()</button>
</form>
<script type="text/javascript">
<!--
function comprobarRepetidos(fr) {
// cojo todos los valores de los campos input type="text" y los meto en un array)
var elementos = fr.elements;
var nElementos = elementos.length;
var aComprobar = [];
var strFinal = "";
for(var i=0; i<nElementos; i++) {
if( elementos[i].tagName.toUpperCase()=="INPUT" && elementos[i].type.toUpperCase()=="TEXT" )
aComprobar.push( elementos[i].value );
}
// ordeno los elementos (los iguales quedarán seguidos)
aComprobar.sort();
// uno los elementos en un string con || (se supone que en tus campos no se escribirá __)
aComprobar = aComprobar.join("__");
// ahora necesito comprobar con una expesion regular las palabras iguales seguidas
var palabrasIguales = aComprobar.match( /([^__]+)__((\1)(__|$))+/g );
if(palabrasIguales==null) {
alert("Bien! No hay palabras repetidas.");
return true;
}
else {
strFinal += ("Vaya! Hay palabras repetidas:\n\r");
for(var i=0; i<palabrasIguales.length; i++) {
var palabraRepetida = palabrasIguales[i].split("__")[0];
var vecesRepetida = palabrasIguales[i].split(palabraRepetida).length - 1;
strFinal += ("Se repite "+palabraRepetida+" "+vecesRepetida+" veces.\n\r" );
}
alert(strFinal);
return false;
}
}
// -->
</script>
</body>
</html>
La expresión regular es un poco complicada. miramos todo lo que no sean __ (letras) seguidos de __ y luego otra vez esas mismas letras (\1) seguidos de __ o del final ($). Miramos también más ocurrencias de eso último.
Bueno, sólo estaba jugando, tal vez te guste así.
Un saludo.