from do_shortcode php comparison operators conditional

do_shortcode - ¿Por qué usar!== FALSE para verificar stripos en php?



<? php echo do_shortcode shortcode); ?> (5)

Aquí está el código que estoy mirando.

foreach ($header as $idx => $field) { if (stripos($field, ''foo'') !== false) { $cols[''foo''] = $idx; } else if (stripos($field, ''bar'') !== false) { $cols[''bar''] = $idx; } else if (stripos($field, ''brr'') !== false) { $cols[''brr''] = $idx; } else if (stripos($field, ''ffo'') !== false) { $cols[''ffo''] = $idx; } }

Lo sentimos, tampoco sé cómo formatear el código de forma bonita, se agradecería cualquier consejo al respecto.

Estoy viendo un código escrito por alguien mucho más inteligente que yo, así que no estoy dispuesto a confiar en mi primera impresión para cambiar todo a if(stripos($foo)) , pero ¿por qué hacerlo de esta manera?


En PHP,! == significa que no es del mismo tipo y valor.

Si stripos () devuelve algo que no sea falso (y exactamente ''falso'', y no cero), significa que ha encontrado algo, incluso si la posición es 0 y se devuelve int (0). 0 y falso son iguales cuando se hace una comparación estándar con el operador == pero no cuando se usa el operador de identidad === , por lo que la única manera de saber si stripos () ha encontrado algo es comparar el valor y el tipo de falso usando ! == (no es idéntico, es decir, del mismo tipo y valor del valor de retorno de strpos ()).


La respuesta es que en PHP un valor "falso" puede ser satisfecho por un puñado de valores, como una matriz vacía, una cadena vacía, un NULO, un entero 0, etc. Vea la página de la función vacía () para una lista completa:

http://php.net/empty

Así que esto siempre daría resultados incorrectos:

if(strpos("abc", "a")) { echo "Yes"; } else { echo "No"; }

Como la "a" se produce en la primera posición (índice 0), PHP considera que "if (0)" es falso.

Cuando strpos NO encuentra la aguja en su pajar, devolverá el FALSO booleano, que es lo que desea consultar con el operador triple igual que verifica tanto el tipo como el valor. Ver los documentos sobre operadores de comparación.

http://www.php.net/manual/en/language.operators.comparison.php


No sé si algo como esto sería más fácil de mantener. Depende si haces algo más en esas condiciones. Pero puede configurar las claves en un archivo de configuración, db, pasar como argumento a su función o similar.

$keys = array( ''foo'', ''bar'', ''brr'', ''ffo'', ); foreach ($header as $idx => $field) { foreach ($keys as $key) { if (stripos($field, $key) !== false) { $cols[$key] = $idx; break; } } }


Porque si la cadena coincide en la posición 0, 0 se evalúa como falso, así que asegúrate de agregar el ''='' extra para que ese tipo se tome en consideración.

strpos() devuelve falso cuando NO se encuentra una coincidencia.

Echa un vistazo a los operadores de comparación .


stripos devuelve la posición de una cadena dentro de otra, y si la cadena no se encuentra, devuelve false, por lo que se recomienda usar los operadores de comparación de identidad (===,! ==), porque PHP considera 0 como "falsy" valor, considera este ejemplo:

// Find the position of the ''a'' character in the ''abc'' string: stripos(''abc'', ''a'') !== false; // true, position is 0 stripos(''abc'', ''a'') != false; // false, 0 is "falsy"